【问题标题】:Threading a task beside a GUI PyQT4在 GUI PyQT4 旁边线程化任务
【发布时间】:2018-03-03 06:35:55
【问题描述】:

所以我正在尝试运行 PyQT GUI,而另一个功能正在后台收集信息。如果找到信息,则 GUI 应自行更新。

我是 Threading 的新手,所以我搜索了很多,发现了一些很好的 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()

谢谢!

【问题讨论】:

    标签: python python-2.7 python-3.x pyqt qthread


    【解决方案1】:

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

    【讨论】:

    • 嘿,成功了。非常感谢!我现在面临的另一个问题是,当 scan_Thread 找到一些附加信息时,我想重新启动 GUI,但 GUI 卡在 app.exec() 中,我无法从 scan_Thread 访问它。有什么想法吗?
    • 重新启动 GUI 或更新 GUI 的视图?,其中任何一个都不应该从辅助线程完成,在辅助线程中创建信号并将其连接到 GUI 中的插槽并在您必须完成更新 gui 所需的任务。
    • 重新启动 GUI 将是最简单的,然后将显示所有新信息。我试图接收信号,但我的大脑似乎无能为力。
    • @Crubuntu 没有GUI恢复,只是更新GUI的元素,必须使用信号。如果您对信号有疑问,我可以通过 github、drive 或类似方式共享您的代码。
    • github.com/Knoedelchan/GrGsm-Gui/tree/Cridibranch 文件是 grgsm_scanner。想法是,总是当“do_scan”找到一个新频道并将其附加到输出文件以更新 GUI 以显示新频道时。如果您有一些想法,我将不胜感激。
    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 2023-04-04
    • 2011-12-28
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多