2016-01-01 22 views
-2

我是一個PyQt的新手,我正在做一個像應用程序的小聊天。我初始化了GUI並創建了幾種管理用戶輸入的方法。問題是,我無法使用網上教程中顯示的self.Method()指令。出於某種原因,Python告訴我,對象沒有屬性'WIDGET',這裏的WIDGET是QListWidget。如何在不使用PyQt上的findChild的情況下訪問方法內部的小部件?

我設法克服了使用findChild,但我不知道這是正確的方式來做到這一點。在PyQt的方法中訪問小部件的正確方法是什麼?

這裏是我的代碼:

import stuff * 
class ASIMOV(QWidget): 
     def __init__(self): 
     super().__init__() 
     self.initUI() 

    def initUI(self): 
     QToolTip.setFont(QFont('SansSerif', 12)) 

     botLog = QListWidget(self) 
     botLog.resize(150, 150) 

     botInput = QLineEdit(self) 
     botInput.returnPressed.connect(self.handleChatInput) 

     vbox = QVBoxLayout() 
     vbox.addWidget(botLog) 
     vbox.addWidget(botInput) 

     self.setLayout(vbox) 
     self.resize(600, 400) 
     self.show() 

    def startChat(self, botLog): 
     u = ASIMOV_user.User() 
     #Greet user 
     botLog.addItem('#: Hey there' + u.getName()) 
     botChat = ASIMOV_chat.Chat() 

    def handleChatInput(self): 
     u = ASIMOV_user.User() 
     print(self.botLog.text()) 
     botInput = self.findChild(QLineEdit, "") 
     botLog = self.findChild(QListWidget, "") 
     #lineEdits = self.findChildren(QLineEdit) 
     botLog.addItem('#' + u.getName() + ': ' + botInput.text()) 
     #print(botInput.text()) 

if __name__=="__main__": 
    app = QApplication(sys.argv) 
    w = ASIMOV() 
    sys.exit(app.exec_()) 

而且,我必須初始化類,每次我想訪問他們的方法,例如從ASIMOV_user類干將?

+1

商店小部件引用的概念,當您通過使他們創造他們實例屬性(例如'self.botInput = QLineEdit(self)')。然後你可以用你的類的任何方法以相同的方式訪問它們('self.botInput')。我建議通過一些基於Python的面向對象編程的基本教程來熟悉您需要成功編寫GUI程序的概念。 –

+0

哦,我覺得這很有道理,非常感謝! –

回答

0

由three_pineapples給出的答案。在這種情況下,原始代碼具有未使用自運算符聲明的小部件,這使它們成爲本地元素。

正如他所描述的,它只需要添加self.WIDGET,以使其可用於應用程序中的其餘方法。

原來的答覆這裏:

商店時,你可以通過讓 實例屬性(例如self.botInput = QLineEdit的(個體經營))創建它們的小部件的引用。然後,您可以使用 類中的任何方法以相同的方式(self.botInput)訪問它們 。我建議通過與Python對象 面向對象編程的一些基本教程運行熟悉 你需要寫成功GUI程序

相關問題