gpt4 book ai didi

python - PyGtk 线程在 main 退出之前不运行

转载 作者:行者123 更新时间:2023-11-28 23:04:14 24 4
gpt4 key购买 nike

几个小时以来,我一直在尝试解决这个问题,搜索网络和阅读文档都没有帮助。我正在尝试在单独的线程中执行长时间运行的任务,并在 UI 的进度条中显示进度。新线程已启动,但在主循环退出之前不会给出任何时间,我在 Gtk.main 之前调用了 Gdk.threads_init() 并且我已经包围了 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 有关吗?

最佳答案

在发布问题之前花了数小时试图找到答案,我在发布后几分钟就找到了解决方案。结果(来自 here)对于 GTK3,您需要调用 GLib.threads_init(),该代码使用初始 from gi.repository import GLib code>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()

关于python - PyGtk 线程在 main 退出之前不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7850134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com