簡體   English   中英

在PyQt中啟動新的QThread()時傳遞參數

[英]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()。

QThreadstart方法不接受參數。 但是,您繼承了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM