在函数中不锁定 Gtk.main() 的睡眠方法

0 投票
2 回答
1679 浏览
提问于 2025-04-18 08:29

我在我的gtk应用程序里有一个函数。我想在这个函数里等2秒钟。比如说:

[...]

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

Gtk.main()

如果我直接用 time.sleep(2),那么界面会卡住2秒钟。那我该怎么在函数里等2秒,而不让 Gtk.main() 被锁住呢?

2 个回答

3

你可以添加一个gtk的超时功能。可以参考这个链接:

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

你现在的函数可以用超时功能来替代time.sleep(),然后返回。第二个函数可以用来“做更多的事情”,并且会被指定为超时的回调函数。

你可能希望第一个函数在程序运行时禁用用来启动这个部分的界面按钮。这样可以防止用户在等待2秒的过程中重复点击那个按钮。第二个函数则应该重新启用这个按钮。

4

你可以使用 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

这个方法不会让程序“睡”整整2秒,而是大约暂停2秒,同时还能让图形界面对其他事件做出反应。正如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()

撰写回答