PyGTK编写多线程程序

采摘处:http://linux-wiki.cn/wiki/zh-cn/PyGTK%E7%BC%96%E5%86%99%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%A8%8B%E5%BA%8F


虽然在PyGTKPython有关多线程的库都可以使用,但其行为常现异常,所以一定要按照PyGTK的要求编写多线程应用程序。

只允许主线程修改图形界面

这是较常用的一种方式,但编写时略显复杂。

首先,在程序初始化时调用(一定在gtk.main()之前运行):

    gobject.threads_init()

多线程的实现方式与纯Python相同:

    t=threading.Thread(target=新线程的函数)
    t.start()

要修改界面的代码则使用gobject.idle_add加到GTK的主循环中。

注意如果新线程函数返回True,则该函数仍在GTK的主循环中,如果返回False,则退出主循环。

下面的例子是PyGTK.org上给出的:


    
import threading
import time
import gobject
import gtk
 
gobject.threads_init()
 
class MyThread(threading.Thread):
    def __init__(self, label):
        super(MyThread, self).__init__()
        self.label = label
        self.quit = False
 
    def update_label(self, counter):
        self.label.set_text("Counter: %i" % counter)
        return False
 
    def run(self):
        counter = 0
        while not self.quit:
            counter += 1
            gobject.idle_add(self.update_label, counter)
            time.sleep(0.1)
 
w = gtk.Window()
l = gtk.Label()
w.add(l)
w.show_all()
w.connect("destroy", lambda _: gtk.main_quit())
t = MyThread(l)
t.start()
 
gtk.main()
t.quit = True

gobject.idle_add(新线程函数, 参数)


允许所有线程修改图形界面

   注意:有人报告说这一方法导致程序在Windows中无法运行,但产生这一问题的原因应是他们忘了写      gtk.threads_enter(),所以请按照下面的说明写程序


这种方法要简单很多。与前面类似,在程序初始化时调用:

    gtk.gdk.threads_init()

不过要把gtk.main()用下面两个函数括起来:

    gtk.threads_enter()
    gtk.main()
    gtk.threads_leave()

其它线程也是如此,在修改界面内容的代码前后加上gtk.threads_enter()、gtk.threads_leave()




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值