2017-09-21 39 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