2015-07-05 3 views
-1

Я новичок в программировании, и я сделал свое исследование на этом сайте и других, но я не могу найти ничего полезного для моей проблемы. Я пишу программу Python с несколькими окнами PyQt, открывающимися при нажатии разных кнопок. Это моя программа:Программа Python работает, но отображается ошибка. Зачем?

import sys, os, 
from PyQt4 import QtCore, QtGui, uic 
Ui_IntroWindow = uic.loadUiType('introduction.ui')[0] 
Ui_ElmWindow = uic.loadUiType('elm.ui')[0] 
Ui_ClueWindow = uic.loadUiType('pistaelm.ui') [0] 
Ui_ButtonWindow = uic.loadUiType('firtsguibutton.ui')[0] 

class IntroWindow(QtGui.QMainWindow, Ui_IntroWindow): 

    def __init__ (self, parent=None): 
     QtGui.QMainWindow.__init__(self, parent) 
     self.setupUi(self) 
     self.continuar.clicked.connect(self.continuar_clicked) 

    def continuar_clicked(self): 
     window = ElmWindow(self) 
     window.show() 
     window.exec_() 
     self.close() 

class ElmWindow(QtGui.QMainWindow, Ui_ElmWindow): 
    def __init__(self, parent=None): 
     QtGui.QMainWindow.__init__(self, parent) 
     self.setupUi(self) 
     self.bpista.clicked.connect(self.pista) 
     self.bcontinuar.clicked.connect(self.continuar) 


    def pista(self): 
     pistaelm = ClueWindow(self) 
     pistaelm.show() 
     pistaelm.exec_() 

    def continuar(self): 
     elemento = str(self.elemento.text()) 
     main = ButtonWindow(self) 
     if elemento == 'cobalto': 
      main.show() 
      main.exec_() 
      self.close()   

class ClueWindow(QtGui.QMainWindow, Ui_ClueWindow): 
    def __init__ (self, parent=None): 
     QtGui.QMainWindow.__init__(self, parent) 
     self.setupUi(self) 

class ButtonWindow(QtGui.QMainWindow, Ui_ButtonWindow): 
    def __init__(self, parent = None): 
     QtGui.QMainWindow.__init__(self, parent) 
     self.setupUi(self) 



app = QtGui.QApplication(sys.argv) 
myWindow = IntroWindow() 
myWindow.show() 
app.exec_() 

Я создал несколько подокон, например, в:

def continuar_clicked(self): 
    window = ElmWindow(self) 
    window.show() 
    window.exec_() 
    self.close() 

Если я не пишу

window.exec_() 

окно откроется, но кнопки не будут работать. Но когда я пишу это, я получаю ошибку:

Traceback (most recent call last): 
    File "C:\Users\Work\Desktop\Project\project.py", line 19, in continuar_clicked 
    window.exec_() 
AttributeError: 'ElmWindow' object has no attribute 'exec_' 

Как я могу остановить ошибку?

+0

пожалуйста отладить программу, чтобы указать часть кода метания ошибки – Balder

+0

извините, но как я отлаживаю программу? я пробовал в режиме ожидания и проверки модуля, но ничего не произошло –

+0

Вероятнее всего, это сообщение об ошибке, чем эта единственная строка. Полное сообщение об ошибке содержит информацию, которая поможет дебютировать. – Joel

ответ

1

Объекты, полученные из QMainWindow, не имеют способа exec_(). Вот почему вы видите исключение.

Причина, по которой это исключение изменяет поведение вашей программы, связано с тем, что когда возникает исключение, остальная часть выполняемого в данный момент слота не запускается. Таким образом, ваш метод continuar_clicked работает до тех пор, пока он не ударит по линии с отсутствующим методом и не остановится.

Это указывает на то, что не вызывая self.close() в continuar_clicked, ваш графический интерфейс работает. Вызов self.close(), по-видимому, нарушает программу.

И что это значит? Ну, это указывает на неправильную иерархию объектов. Вы создаете новые окна, которые являются дочерними элементами существующего окна, а затем закрывают родительское окно. Вполне возможно, что родительское окно удаляется, в зависимости от того, установлено ли для атрибута Qt.WA_DeleteOnClose значение true для ваших окон.

Поэтому я бы предложил перепроектировать вашу программу. Возможно, есть родительское окно, которое всегда открыто, или написать класс управления окном, который обрабатывает создание/закрытие всех окон (например, оконный объект вызывает метод из вашего объекта управления окном, чтобы закрыть текущее окно и открыть новое окно).

В конце концов, как вы структурировать ваш код будет до вас, как это трудно оценить детали вашей программы от минимального примера

+0

Хорошо объясненный ответ. –

+0

Согласен, это было очень полезно. Благодаря! –

Смежные вопросы