2013-12-18 30 views
1

我開發的程序可以同時從不同的網站獲取包含(現在基本上是從兩個或多個在線字典中檢索一個詞的定義),但我遇到了一個問題。PyQt5:在使用QObject和QThread時出現AttributeError

我用QObject和QThread來開發我的程序。一開始一切都很順利,但是當我試圖再次搜索並檢索另一個單詞時,我得到了2個AttributeError。

import sys 
from PyQt5.QtWidgets import QApplication, QMainWindow 
from gui import Ui_MainWindow 
from PyQt5.QtCore import QObject, QThread, pyqtSignal 

class Searcher(QObject): 
    signalUpdate=pyqtSignal(str, str) 

    def __init__(self, dictionary, word): 
     super(Searcher, self).__init__() 
     self.dictionary=dictionary 
     self.word=word 
    def run(self): 
     self.signalUpdate.emit(self.dictionary, self.word)  

class MyMainWindow(QMainWindow, Ui_MainWindow, QObject): 
    signalSearch=pyqtSignal() 

    def __init__(self, parent=None): 
     super(MyMainWindow, self).__init__() 
     self.setupUi(self) 
     self.dictList=['Yahoo dictionary', 'Webster dictionary'] 
     self.searchThreads=[QThread(), QThread()] 


    def click(self): 
     word=self.lineEdit.text() 
     self.searchers=[] 

     for dictionary in self.dictList: 
      self.searchers.append(Searcher(dictionary, word)) 

     for index , searcher in enumerate(self.searchers): 
      searcher.signalUpdate.connect(self.updateGUI) 
      searcher.moveToThread(self.searchThreads[index]) 
      self.searchThreads[index].start() 
      self.signalSearch.connect(searcher.run) 

     self.signalSearch.emit() 

    def updateGUI(self, dictionary, word): 
     print(dictionary+'['+word+']') 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    myapp = MyMainWindow() 
    myapp.show() 

    sys.exit(app.exec_()) 

我不知道該如何處理這個問題。有誰知道如何擺脫它?

Traceback (most recent call last): 
Traceback (most recent call last): 
File "C:\workspace\online-dictionary\main.py", line 22, in run 
File "C:\workspace\online-dictionary\main.py", line 22, in run 
self.signalUpdate.emit(self.dictionary, self.word)  
self.signalUpdate.emit(self.dictionary, self.word)  
AttributeError: 'NoneType' object has no attribute 'signalUpdate' 
AttributeError: 'NoneType' object has no attribute 'signalUpdate' 
+0

可否請您提供完整的追蹤? – aIKid

+0

我在帖子中添加了回溯。謝謝:) – dacapo1142

回答

0

問題是由於每次搜索完成後刪除搜索對象列表而引起的,這是不必要的。

您只需要創建搜索對象一次,然後通過發送signalSearch所需的單詞向其發出請求。

所以搜索類是這樣的:

class Searcher(QObject): 
    signalUpdate = pyqtSignal(str, str) 

    def __init__(self, dictionary): 
     super(Searcher, self).__init__() 
     self.dictionary = dictionary 

    # word is sent by signalSearch 
    def run(self, word): 
     self.signalUpdate.emit(self.dictionary, word) 

和主窗口類是這樣的:

class MyMainWindow(QMainWindow, Ui_MainWindow): 
    signalSearch = pyqtSignal(str) 

    def __init__(self, parent=None): 
     super(MyMainWindow, self).__init__() 
     self.setupUi(self) 
     self.dictList = ['Yahoo dictionary', 'Webster dictionary'] 
     self.searchThreads = [] 
     self.searchers = [] 
     # create all the threads and searchers once 
     for dictionary in self.dictList: 
      thread = QThread(self) 
      self.searchThreads.append(thread) 
      searcher = Searcher(dictionary) 
      self.searchers.append(searcher) 
      searcher.signalUpdate.connect(self.updateGUI) 
      self.signalSearch.connect(searcher.run) 
      searcher.moveToThread(thread) 
      thread.start() 

    def click(self): 
     # send a new word to the searchers 
     self.signalSearch.emit(self.lineEdit.text()) 

    def updateGUI(self, dictionary, word): 
     print(dictionary+'['+word+']') 
相關問題