2011-10-23 3019 views
3

我有一個用Python編寫的多線程應用程序,其中一個線程「照顧」GUI,另一個線程是工作線程。然而,工作者線程有兩個主要功能(或者說可以說兩個主要工作),並且我需要告訴run函數完成哪項工作。在PyQt中啓動新QThread()時傳遞參數

所以我想到的是在工作線程中創建一個運行函數,它將接受一個參數(保存爲「self」),參數可以是「創建」或上傳。 -code是我到目前爲止有:

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()。

回答

7

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 
+0

非常感謝 - 這工作。 –

+2

@Deusdies upload_data()是同一個線程的函數嗎?如何發送一行作爲參數? – karensantana

+0

你能解釋一下'超級等'的含義嗎? –

1

禮Bendersky的答案是正確的,但參數的順序出現錯誤。

如果調用Worker類是這樣的:

爲我工作的參數順序:

def __init__(self, parent=None, do_create_data=True): 

在伊萊Bendersky的回答顯示的順序製作了我這個錯誤消息:

TypeError: QThread(QObject parent=None): argument 1 has unexpected type 'str' 

不知道爲什麼,但我確定有人可以幫忙解釋。

+0

將'parent'參數作爲最後一個可選參數。由於它沒有被使用,你甚至可以擺脫它。 – danger89