2014-01-26 5 views
0

У меня возникла эта проблема, при которой мое выполнение продолжает вызывать ошибку, что делает невозможным выполнение моей программы вообще. Мое сообщение об ошибке: объект 'mainWindow' не имеет атрибута 'updateMenu'Невозможно найти причину ошибки в моей программе

Но я попытался определить его в предыдущей части, но я не могу заставить его работать.

Может ли кто-нибудь сказать мне, где я ошибаюсь?

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class mainWindow(QDialog): 
    def __init__(self, parent=None): 
     super(mainWindow, self).__init__(parent) 
     self.updateMenu() 

     self.setShowLbl = QLabel('Show Name') 
     self.setShowTxt = QLineEdit() 
     self.setShowBtn = QPushButton('Set Show') 

     gridLayout01 = QGridLayout() 
     gridLayout01.addWidget(self.setShowLbl,0,0) 
     gridLayout01.addWidget(self.setShowTxt,0,1) 
     gridLayout01.addWidget(self.setShowBtn,0,2) 

     self.setLayout(gridLayout01) 
     self.setWindowTitle("Set Shot") 

     self.connect(self.setShowBtn, SIGNAL('clicked()'), self.updateMenu) 

     def updateMenu(self): 
      print('working') 

app = QApplication(sys.argv) 
form = mainWindow() 
form.show() 
app.exec_() 
+2

В вашем коде дважды проверьте, что 'def updateMenu (self):' выравнивается с 'def __init __ (self, parent = None)' - если ваш код показан так, то вы определяете 'updateMenu' ** внутри ** ваш '__init__' ... –

+0

Пасс ... никогда не использовал Qt - и я думаю, что это, вероятно, вопрос стиля/вкуса - я бы рекомендовал найти некоторые проекты с открытым исходным кодом, которые его используют, и получить оттуда руководство. Конечно, вы также можете задать новый вопрос, объясняющий, что вы пытаетесь сделать с помощью [sscce] (http://sscce.org/). –

ответ

2

Ваша ошибка говорит, что нет updateMenu() метод на вашем mainWindow объекта, если ваш код точно, как показано на ваш вопрос, @ Йон-Clements правильно, вы должны линейке updateMenu() в своем классе:

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class mainWindow(QDialog): 
    def __init__(self, parent=None): 
     super(mainWindow, self).__init__(parent) 
     self.updateMenu() 

     self.setShowLbl = QLabel('Show Name') 
     self.setShowTxt = QLineEdit() 
     self.setShowBtn = QPushButton('Set Show') 

     gridLayout01 = QGridLayout() 
     gridLayout01.addWidget(self.setShowLbl,0,0) 
     gridLayout01.addWidget(self.setShowTxt,0,1) 
     gridLayout01.addWidget(self.setShowBtn,0,2) 

     self.setLayout(gridLayout01) 
     self.setWindowTitle("Set Shot") 

     self.setShowBtn.clicked.connect(self.updateMenu) 

    def updateMenu(self): 
     print('working') 

app = QApplication(sys.argv) 
form = mainWindow() 
form.show() 
app.exec_() 

Я не PyQt4 больше, поэтому я не могу проверить свой код, как есть, но она хорошо выглядит и работает со мной.

+2

Также рассмотрите возможность использования нового механизма сигнала/слота. В частности, вы можете заменить строку 'self.connect (...)' 'self.setShowBtn.clicked.connect (self.updateMenu)' –

+0

Спасибо, ребята! Оказывается, это проблема выравнивания. Кстати, могу я спросить, в чем разница между методом self.connect (...) и self.setShowBtn.clicked.connect (self.updateMenu)? – yan

+0

В основном это заканчивается тем же, но последнее - это лучший способ сделать это, который более просто и четко определяет, как обрабатывается ваше событие. И если у вас есть завершение кода, вы можете выбрать свое событие просто путем завершения после 'self.setShowBtn.' ;-) И если я не ошибаюсь (мне нужно проверить дважды), старая форма будет устаревать с Qt5 ... хотя я не занимался интерфейсами Qt, поэтому я не могу быть уверен в этом на 100%. – zmo

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