如何在python中绕过gtk事件循环的阻塞行为
我将问题归结为以下简单的示例脚本:如何在python中绕过gtk事件循环的阻塞行为,gtk,pygtk,gtk2,Gtk,Pygtk,Gtk2,我将问题归结为以下简单的示例脚本: #! /usr/bin/python import hello from threading import Thread def myfunc(): hello.HelloWorld().main() t = Thread(target=myfunc) t.start() print '\nstill running ???' 问题是我试图找到一些方法来绕过gtk事件循环的阻塞行为。这可能吗?如您所见,即使我从单独的线程调用该类,事
#! /usr/bin/python
import hello
from threading import Thread
def myfunc():
hello.HelloWorld().main()
t = Thread(target=myfunc)
t.start()
print '\nstill running ???'
问题是我试图找到一些方法来绕过gtk事件循环的阻塞行为。这可能吗?如您所见,即使我从单独的线程调用该类,事件循环也会阻止主脚本中的进一步进程(“仍在运行?”)直到gtk应用程序关闭后才会打印出来)您应该阅读。GTK应该在主线程中使用,但我同意这很奇怪
我尝试了以下代码:
#! /usr/bin/python
import gtk
from time import sleep
from threading import Thread
def myfunc():
w = gtk.Window()
l = gtk.Label()
w.add(l)
w.show_all()
w.connect("destroy", lambda _: gtk.main_quit())
gtk.main()
def myfunc2():
sleep (3)
t = Thread(target=myfunc)
#t = Thread(target=myfunc2)
t.start()
print '\nstill running ???'
更糟糕的是,几乎所有信息都会在关闭应用程序后打印出来,但有时会在关闭应用程序之前出现。因此,这里有一个奇怪的行为。您应该阅读。GTK应该在主线程中使用,但我同意这很奇怪
我尝试了以下代码:
#! /usr/bin/python
import gtk
from time import sleep
from threading import Thread
def myfunc():
w = gtk.Window()
l = gtk.Label()
w.add(l)
w.show_all()
w.connect("destroy", lambda _: gtk.main_quit())
gtk.main()
def myfunc2():
sleep (3)
t = Thread(target=myfunc)
#t = Thread(target=myfunc2)
t.start()
print '\nstill running ???'
更糟糕的是,几乎所有信息都会在关闭应用程序后打印出来,但有时会在关闭应用程序之前出现。所以,这里有一个奇怪的行为。请原谅我的无知,但是由于
hello.HelloWorld().main()
在函数myfunc
中,它是创建的线程的目标,而不是hello.HelloWorld().main()
在新线程中创建的。哦,是的,对不起,请读快一点。我真的不知道为什么,但是在线程中调用gtk.main()
确实会阻塞主线程,而'sleep(10)则不会。然而,GTK不是线程安全的,所以您不应该尝试在线程中执行一些图形化的操作。你应该把你的打印在一个线程和保持GTK的东西在主线程。我修改了我的帖子来反映这一点。谢谢你的链接。我没有看到那个页面,也不知道pygtk中线程涉及的许多方面。我开始觉得我不应该在一个线程中启动gtk。谢谢你的确认。这是全新的,需要学习的内容很多。还要注意,这都是GTK2特有的,GTK3的python绑定使用pyGObject。更多信息请访问:请原谅我的无知,但是由于hello.HelloWorld().main()
在函数myfunc
中,而创建的线程的目标不是hello.HelloWorld().main()
在新线程中创建的?哦,是的,抱歉,请快速阅读。我真的不知道为什么,但是在线程中调用gtk.main()
确实会阻塞主线程,而'sleep(10)则不会。然而,GTK不是线程安全的,所以您不应该尝试在线程中执行一些图形化的操作。你应该把你的打印在一个线程和保持GTK的东西在主线程。我修改了我的帖子来反映这一点。谢谢你的链接。我没有看到那个页面,也不知道pygtk中线程涉及的许多方面。我开始觉得我不应该在一个线程中启动gtk。谢谢你的确认。这是全新的,需要学习的内容很多。还要注意,这都是GTK2特有的,GTK3的python绑定使用pyGObject。更多信息,请访问: