繁体   English   中英

PyGtk线程直到主程序退出后才运行

[英]PyGtk thread not running until main quits

数小时以来,我一直在尝试对这个问题进行排序,在网络上搜索和阅读文档都无济于事。 我正在尝试在单独的线程中执行长时间运行的任务,并在UI的进度栏中显示进度。 新的线程启动,但直到主循环退出没有给出任何时候,我都要求Gdk.threads_init()之前Gtk.main ,我已经包围UI与调用Gdk.threads_enter()Gdk.threads_leave()

以下代码重现了该问题,单击“开始”按钮无效,但是一旦关闭窗口并退出主循环,我就会看到第二个线程正在工作(即,我看到打印语句相隔半秒)

class App(Gtk.Window):

    def __init__(self):
        super(App, self).__init__()
        self.connect("destroy", self.on_destroy)

        self.layout = Gtk.VBox()
        self.progress = Gtk.ProgressBar()
        self.layout.pack_start(self.progress, False, False, 0)

        self.set_size_request(100,100)

        self.go_button = Gtk.Button("Start")
        self.go_button.connect("clicked", self.do_work_subclass)
        self.layout.pack_start(self.go_button, False, False, 0)

        self.add(self.layout)
        self.show_all()



    def on_destroy(widget, event):
        Gtk.main_quit()

    def do_work(self, widget):
        def worker_thread():
            so_far = 0
            while so_far < 10:
                time.sleep(0.5)
                print("work so far: %s" % so_far)
                Gdk.threads_enter()
                try:
                    if so_far > 0:
                        self.progress.set_fraction(so_far / 10.0)
                finally:
                    Gdk.threads_leave()
                so_far += 1
        threading.Thread(target=worker_thread).start()


if __name__ == "__main__":
    app = App()
    Gdk.threads_init()
    Gdk.threads_enter()
    Gtk.main()
    Gdk.threads_leave() 

这可能与我正在使用Gtk3有关吗?

在发布问题之前花了数小时试图找到答案,我在发布后几分钟找到了解决方案。 结果(从这里开始 )对于GTK3,您需要调用GLib.threads_init() ,该代码可以在调用GLib.threads_init() ,使用from gi.repository import GLibGLib.threads_init()GLib.threads_init()进行Gtk.main()该代码的工作版本如下所示:

from gi.repository import Gtk,Gdk, GLib
import threading 
import time

class App(Gtk.Window):

    def __init__(self):
        super(App, self).__init__()
        self.connect("destroy", self.on_destroy)

        self.layout = Gtk.VBox()
        self.progress = Gtk.ProgressBar()
        self.layout.pack_start(self.progress, False, False, 0)

        self.set_size_request(100,100)

        self.go_button = Gtk.Button("Start")
        self.go_button.connect("clicked", self.do_work)
        self.layout.pack_start(self.go_button, False, False, 0)

        self.add(self.layout)
        self.show_all()



    def on_destroy(widget, event):
        Gtk.main_quit()

    def do_work(self, widget):
        def worker_thread():
            so_far = 0
            while so_far < 10:
                time.sleep(0.5)
                print("work so far: %s" % so_far)
                Gdk.threads_enter()
                try:
                    if so_far > 0:
                        self.progress.set_fraction(so_far / 10.0)
                finally:
                    Gdk.threads_leave()
                so_far += 1
        threading.Thread(target=worker_thread).start()



if __name__ == "__main__":
    app = App()
    GLib.threads_init()
    Gdk.threads_init()
    Gdk.threads_enter()
    Gtk.main()
    Gdk.threads_leave()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM