2013-03-29 60 views
11

我在Python中遇到QThreads問題。我想改變標籤的背景顏色。 但我的應用程序在啓動時崩潰。 「的QThread:被毀壞,而線程仍在運行」QThread:線程仍在運行時被銷燬

class MainWindow(QMainWindow): 
     def __init__(self): 
      QMainWindow.__init__(self) 
      self.ui = Ui_MainWindow() 
      self.ui.setupUi(self) 

      statusTh = statusThread(self) 
      self.connect(statusTh, SIGNAL('setStatus'), self.st, Qt.QueuedConnection) 
      statusTh.start() 

     def st(self): 
      if self.status == 'ON': 
       self.ui.label.setStyleSheet('background-color:green') 
      else: 
       self.ui.label.setStyleSheet('background-color:red') 

    class statusThread(QThread): 
     def __init__(self, mw): 
      super(statusThread, self).__init__() 

     def run(self): 
      while True: 
       time.sleep(1) 
       self.emit(SIGNAL('setStatus')) 

    if __name__ == "__main__": 
     app = QApplication(sys.argv) 
     main_window = MainWindow() 
     main_window.show() 
     sys.exit(app.exec_()) 
+0

一個Qt式的解決方案,指定主窗口'statusTh'的母公司,即'超(statusThread,個體經營).__的init __(MW)'。 – nymk

+0

非常感謝。它現在正在工作 –

+0

僅供參考,這基本上是一樣的:在這種情況下,父級將保持對線程實例的引用,因此不會被垃圾收集。 – rainer

回答

20

你不是存儲到它的創建後的線程,這意味着它會被垃圾收集(即銷燬。)一些後,時間的參考程序離開MainWindow s __init__。你需要將它存儲只要線程運行至少,例如使用self.statusTh

self.statusTh = statusThread(self) 
self.connect(self.statusTh, SIGNAL('setStatus'), self.st, Qt.QueuedConnection) 
self.statusTh.start() 
+0

對不起,我是Python的新手。我無法理解。我如何需要存儲參考? –

+5

正如我在我的答案中寫的。通過將'statusThread(self)'實例賦值給一個局部變量(即前面沒有'self.'),當局部變量超出範圍時它將被垃圾收集(當'__init__' 'MainWindow'完成)。如果您將引用存儲在'MainWindow'類的成員變量中(即前面帶'self.'),則在__init__完成時它不會超出範圍,從而導致線程對象不存在垃圾收集。 – rainer

+0

我會給10個upvotes!很好的回答 - 爲我節省了很多時間和悲傷!我認爲你應該將評論文本也移到答案中。 –

相關問題