在一个函数中没有锁定Gtk.main()的睡眠

时间:2014-06-03 21:51:26

标签: python multithreading pygtk

我的gtk应用程序中有一个功能。我想在那个功能中等待2秒钟。 例如:

[...]

def do_something_and_wait(self):
    #do something here
    time.sleep(2)
    # do something more

Gtk.main()

如果我直接使用time.sleep(2),Gui会冻结2秒钟。 如何在没有锁定Gtk.main()的函数中等待2秒?

2 个答案:

答案 0 :(得分:3)

您可以使用gtk.Main_iteration()暂时将控制权交还给GUI,请参阅:

http://www.pygtk.org/pygtk2reference/gtk-functions.html#function-gtk--main-iterationhttp://book.huihoo.com/gtk+-gnome-application-development/sec-mainloop.html

完全 2s不会休眠,但会暂停大约2秒,仍然允许GUI响应其他事件。正如bazza指出的那样,禁用调用小部件也是一个好主意。

def updateGUI():
    '''Force update of GTK mainloop during a long-running process'''
    while gtk.events_pending():
        gtk.main_iteration(False)

def wait_2s():
    for i in range(10):
        time.sleep(0.2)
        updateGUI()

答案 1 :(得分:1)

您可以添加gtk超时。见

http://www.pygtk.org/pygtk2tutorial/ch-TimeoutsIOAndIdleFunctions.html

您现有的函数会添加超时而不是time.sleep(),然后返回。第二个函数将“执行更多操作”,并将被指定为超时的回调函数。

您可能希望第一个函数禁用用于设置程序的这一部分运行的GUI小部件。这将阻止用户在等待2秒钟时按下该按钮两次。第二个功能应该重新启用它。