如何在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。更多信息,请访问: