2017-09-21 76 views
0

所以我試圖運行一個PyQT GUI,而另一個功能是在後臺收集信息。如果找到信息,GUI應該自行更新。在GUI旁執行一項任務PyQT4

我是線程新手,所以我GOOGLE了很多,發現了一些很好的HowTo,雖然它不工作,因爲它應該。

當我運行程序它只是在3秒後自行結束。

也許你看到一些重大錯誤,我做了。

下面是基本的代碼我試圖去運行

class scan_Thread(QThread): 
    def __init__(self, samp_rate, band, speed, ppm, gain, args, prn): 
     QThread.__init__(self) 
      self.samp_rate=samp_rate 
      self.band=band 
      self.speed=speed 
      self.ppm=ppm 
      self.gain=gain 
      self.args=args 
      self.prn=prn 

     def __del__(self): 
      self.wait() 

     def run(self): 
      do_scan(self.samp_rate, self.band, self.speed, 
        self.ppm, self.gain, self.args, self.prn) 


def start_gui(): 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 
    #app.exec_() 
    #sys.exit() 

def main(options = None): 

    def printfunc(found_list): 
     for info in sorted(found_list): 
      print info 

    get_thread = scan_Thread(options.samp_rate, options.band, options.speed, 
       options.ppm, options.gain, options.args, printfunc) 
    get_thread.start() 
    start_gui() 

謝謝!

回答

0

許多Qt類的對象以及PyQt的對象都需要啓動一些類型爲Application的對象(QCoreApplication,QtGuiApplication或QApplication),但這些對象中只有一個必須存在。

在你的特殊情況下,QThread需要它。以前的類負責生成必要的循環。

所以,你應該修改代碼以下列:

def main(options = None): 
    app = QtGui.QApplication(sys.argv) // before creating any PyQt object. 

    def printfunc(found_list): 
     for info in sorted(found_list): 
      print info 

    get_thread = scan_Thread(options.samp_rate, options.band, options.speed, 
       options.ppm, options.gain, options.args, printfunc) 
    get_thread.start() 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 
+0

請不要忘記,以紀念我的答案是正確的。 – eyllanesc

+0

嘿,那工作。非常感謝!我現在面臨的另一個問題是,當scan_Thread發現一些附加信息時,我想重新啓動GUI,但GUI在app.exec()中搜索並且我無法從scan_Thread訪問它。有任何想法嗎? – Crubuntu

+0

重新啓動GUI或更新GUI的視圖?,它們中的任何一個都不應該從輔助線程完成,在輔助線程中創建一個信號並將其連接到GUI中的一個插槽,並且必須完成必要的任務更新gui。 – eyllanesc