pygtk 编写多线程程序
2017-10-24 14:02
387 查看
参考http://linux-wiki.cn/wiki
虽然在PyGTK中Python有关多线程的库都可以使用,但其行为常现异常,所以一定要按照PyGTK的要求编写多线程应用程序。
多线程的实现方式与纯Python相同:
要修改界面的代码则使用gobject.idle_add加到GTK的主循环中。
注意如果新线程函数返回True,则该函数仍在GTK的主循环中,如果返回False,则退出主循环。
下面的例子是PyGTK.org上给出的:
不过要把gtk.main()用下面两个函数括起来:
其它线程也是如此,在修改界面内容的代码前后加上gtk.threads_enter()、gtk.threads_leave()
虽然在PyGTK中Python有关多线程的库都可以使用,但其行为常现异常,所以一定要按照PyGTK的要求编写多线程应用程序。
一、只允许主线程修改图形界面
首先,在程序初始化时调用(一定在gtk.main()之前运行):gobject.threads_init()
多线程的实现方式与纯Python相同:
t=threading.Thread(target=新线程的函数) t.start()
要修改界面的代码则使用gobject.idle_add加到GTK的主循环中。
gobject.idle_add(新线程函数, 参数)
注意如果新线程函数返回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
二、允许所有的线程修改界面
这种方法要简单很多。与前面类似,在程序初始化时调用:gtk.gdk.threads_init()
不过要把gtk.main()用下面两个函数括起来:
gtk.threads_enter() gtk.main() gtk.threads_leave()
其它线程也是如此,在修改界面内容的代码前后加上gtk.threads_enter()、gtk.threads_leave()
相关文章推荐
- PyGTK编写多线程程序
- 使用 C++11 编写 Linux 多线程程序
- C#编写的多线程端口扫描程序!
- 用C++11 thread 类编写多线程程序
- C#编写的多线程端口扫描程序
- Android 服务与多线程——编写简单的音乐播放器程序
- volatile编写多线程程序的好帮手
- 【VB.NET2010】多线程程序编写技术分析
- Visual C#中编写多线程程序之起步
- 基于Mysql C Api编写mysql客户端程序 多线程
- volatile编写多线程程序的好帮手
- 用MFC编写多线程程序常用函数
- 通过编写聊天程序来熟悉python中多线程及socket的用法
- 如何使用Java编写多线程程序
- 用VB编写异步多线程下载程序
- 使用 C++11 编写 Linux 多线程程序
- VC:简单聊天室程序1 --- 多线程编写网络聊天室程序
- Linux多线程实践(10) --使用 C++11 编写 Linux 多线程程序
- 使用 C++11 编写 Linux 多线程程序
- 在VS2010下,用C语言编写pthread多线程程序的配置