PyGTK 阻塞非 GUI 线程

8 投票
1 回答
1384 浏览
提问于 2025-04-16 18:11

我想用PyGTK来玩一下线程的问题。我现在有了以下这段代码:

#!/usr/bin/python

import pygtk
pygtk.require('2.0')
import gtk
import threading
from time import sleep

class SomeNonGUIThread(threading.Thread):
    def __init__(self, tid):
        super(SomeNonGUIThread, self).__init__()
        self.tid = tid

    def run(self):
        while True:
            print "Client #%d" % self.tid
            sleep(0.5)

class App(threading.Thread):
    def __init__(self):
        super(App, self).__init__()

        self.window = gtk.Window()
        self.window.set_size_request(300, 300)
        self.window.set_position(gtk.WIN_POS_CENTER)
        self.window.connect('destroy', gtk.main_quit)

        self.window.show_all()

    def run(self):
        print "Main start"
        gtk.main()
        print "Main end"


if __name__ == "__main__":
    app = App()

    threads = []
    for i in range(5):
        t = SomeNonGUIThread(i)
        threads.append(t)

    # Ready, set, go!
    for t in threads:
        t.start()

    # Threads work so well so far
    sleep(3)

    # And now, they freeze :-(
    app.start()

这段代码的效果是,非图形界面的线程会同时运行3秒钟。之后,窗口会显示出来,其他线程会停止!在关闭窗口后,线程又会继续运行。

那么,gtk.main()是怎么做到阻止其他线程运行的呢?这些线程并不依赖于任何锁,所以它们在窗口显示的时候应该是可以继续工作的。

1 个回答

5

在你进行任何与Gtk相关的操作之前,必须先调用 gobject.threads_init()

在PyGtk的常见问题解答中可以找到更多信息

撰写回答