python - time .sleep() 在命令中以错误的顺序发生;总是在函数的开头

标签 python python-3.x gtk

下面的代码是我正在开发的一个小型应用程序的精简版本(为了清晰起见); child 拼写单词的应用程序。

问题

我遇到的问题是在函数flash_ Correct()中;它的目的是显示一个单词 5 秒,然后再次隐藏。

我一定有一个愚蠢的盲点,但无论我把time.sleep(5)放在哪里,函数都会以5秒的休息时间开始,而条目:self .entry2 从未出现:

enter image description here

但是,如果没有time.sleep(5),它会正确显示:

enter image description here

我的盲点在哪里?

(精简的)代码:

#!/usr/bin/env python3
from gi.repository import Gtk, Pango, Gdk
import subprocess
import time

       
class InterFace(Gtk.Window):

    def __init__(self):

        Gtk.Window.__init__(self, title="Woorden raden")
        maingrid = Gtk.Grid()
        self.add(maingrid)
        maingrid.set_border_width(10)

        self.entry2 = Gtk.Entry()
        self.entry2.set_size_request(500,60)
        self.entry2.set_child_visible(False)
        self.entry2.modify_font(Pango.FontDescription('Ubuntu 30'))
        maingrid.attach(self.entry2, 0, 4, 4, 1)

        quitbutton = Gtk.Button("Stop", use_underline=True)
        quitbutton.modify_font(Pango.FontDescription('Ubuntu 20'))
        quitbutton.connect("clicked", self.on_close_clicked)
        maingrid.attach(quitbutton, 3, 7, 1, 1)

        showword_button = Gtk.Button("↺", use_underline=True)
        showword_button.modify_font(Pango.FontDescription('Ubuntu 25'))
        showword_button.connect("clicked", self.flash_correct)
        showword_button.set_size_request(60,20)
        maingrid.attach(showword_button, 0, 6, 1, 1)

    def flash_correct(self, button):
        # the time.sleep(5) seems to take place at the beginning
        # no matter in which order I set the commands
        self.entry2.set_text("Monkey")
        self.entry2.set_child_visible(True)
        time.sleep(5)
        self.entry2.set_child_visible(False)

    def on_close_clicked(self, button):
        Gtk.main_quit()


window = InterFace()
window.connect("delete-event", Gtk.main_quit)
window.set_default_size(330, 330)
window.set_resizable(False)
window.show_all()
Gtk.main()

最佳答案

您可以使用 time.time 在循环中调用 Gtk.main_iteration() 隐藏大约 5 秒,以避免您的应用变得无响应。

def hide(self, time_lapse):
    start = time.time()
    end = start + time_lapse
    while end > time.time():
        Gtk.main_iteration()

def flash_correct(self, button):
    # the time.sleep(5) seems to take place at the beginning
    # no matter in which order I set the commands
    self.entry2.set_text("Monkey")
    self.entry2.set_child_visible(True)
    self.hide(5)
    self.entry2.set_child_visible(False)

pygtk faq 7中有很好的解释。How can I force updates to the application windows during a long callback or other internal operation?

If you have a long-running callback or internal operation that tries to modify the application windows incrementally during its execution, you will notice that this doesn't happen; the windows of your app freeze for the duration.

This is by design: all gtk events (including window refreshing and updates) are handled in the mainloop, and while your application or callback code is running the mainloop can't handle window update events. Therefore nothing will happen in the application windows.

The trick here is to realize where your operation can take a while to return, or where it is dynamically changing the window contents, and add a code fragment like this wherever you want an update forced out:

while gtk.events_pending():
   gtk.main_iteration(False)

This tells gtk to process any window events that have been left pending. If your handler has a long loop, for instance, inserting this snippet as part of the loop will avoid it hanging the window till the callback has finished.

More eloquently, in the words of the great Malcolm Tredinnick, 'this requires using what should be called "Secret Technique #1 For Making Your Application Look Responsive"(tm):

添加 while gtk.events_pending(): 也可能没有什么坏处。

关于python - time .sleep() 在命令中以错误的顺序发生;总是在函数的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31035818/

相关文章:

Python 根据另一个列表中的名称在一个列表中添加值

python Selenium : Getting dynamic content within iframe

Python:对本地服务器的请求不起作用

python - 防止许多独立的Python对象之一递减为0并破坏其他Python对象所依赖的C指针

python - 使用 QT 设计器创建的 PyQt5 程序从终端打开时不显示任何窗口

Ubuntu 上的 Eclipse Indigo 经常挂起或卡住

python - 为什么 IDLE 不需要 'if __name__ == "__main__": to run a test case, 但 PyCharm 需要?

python - redis.exceptions.ConnectionError : Error -2 connecting to localhost:6379. 名称或服务未知

linux - 如何为 Ubuntu 创建登录屏幕替代品

multithreading - 多线程与引用计数 : does each thread count variables separately