[英]Passing an argument when starting new QThread() in PyQt
我有一個用Python編寫的多線程應用程序,其中一個線程“關注”GUI,另一個是工作線程。 但是,工作線程有兩個主要功能(或者說兩個主要工作),我需要告訴run函數要完成哪個工作。
所以我想到的是在工作線程中創建一個運行函數,該函數將采用一個參數(除了“self”)。參數將是“創建”或上傳。沒有更多的麻煩,這里有一些代碼,我到目前為止:
GUI.py
class GUI(QMainWindow):
def __init__(self, parent=None):
super, etc
self.worker = worker.Worker()
def create(self):
self.worker.start()
def upload(self):
self.worker.start()
Worker.py
class Worker(QThread):
def __init__(self, parent=None):
super, etc
def run(self):
self.create_data() # OR self.upload_data(), depends
所以問題是,如何告訴worker.start()我希望它執行哪些功能? 我意識到可以直接使用worker.run()方法,但是我用“PyQT快速GUI開發”告訴我永遠不要直接調用worker.run(),並且總是使用worker.start()。
QThread
的start
方法不接受參數。 但是,您繼承了QThread
因此您可以隨意自定義它。 因此,要實現您想要的,只需將參數傳遞給Worker
的構造函數。
這是您的代碼示例稍作修改,以顯示此操作:
class Worker(QThread):
def __init__(self, do_create_data=True, parent=None):
super(QThread, self).__init__()
self.do_create_data = create_data
def run(self):
if self.create_data:
self.create_data()
else:
self.upload_data(), depends
Eli Bendersky的答案是正確的,但是參數的順序似乎是錯誤的。
如果你像這樣調用Worker類:
對我有用的參數順序:
def __init__(self, parent=None, do_create_data=True):
Eli Bendersky的回答中顯示的順序為我生成了此錯誤消息:
TypeError: QThread(QObject parent=None): argument 1 has unexpected type 'str'
不知道為什么,但我相信有人可以幫忙解釋一下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.