【问题标题】:Time delay Tkinter时间延迟 Tkinter
【发布时间】:2013-11-22 03:43:46
【问题描述】:

我想在 PyDev (Eclipse) python 2.75 中制作一个图形窗口。

我做了几件事,但我想做一个“入口”“眨眼”。它测试用户输入。 如果它是一个整数,它应该闪烁绿色一秒钟,然后变成白色。但如果它是一串别的东西,它应该闪烁红色,然后变成白色。我使用了time.sleep(),但它并不能如我所愿。

这是我执行此操作的代码:

def sprawdzam():

    z = e.get()
    try:
        z = int(z)
        e.config(bg = 'green')
        time.sleep(2)
        e.config(bg = 'white')    

    except:
        l.config(bg = 'red')
        time.sleep(2)
        e.config(bg = 'white')

【问题讨论】:

  • 哦,我为我的英语道歉(我知道这不好)

标签: python time tkinter


【解决方案1】:

time.sleep 阻止程序的执行。

使用after

例如:

from Tkinter import *

def blink():
    e.config(bg='green')
    e.after(1000, lambda: e.config(bg='white')) # after 1000ms

root = Tk()
e = Entry(root)
e.pack()
b = Button(root, text='blink', command=blink)
b.pack()
root.mainloop()

【讨论】:

  • @Maq92,请发布另一个单独的问题。
  • 有没有办法让它等待主循环的执行一次?我只想等待一个小部件刷新其显示,然后再运行其余部分。
  • @ArtOfWarfare,对不起。我不明白你是什么意思。你能用示例代码发布一个问题吗?
  • 这个答案允许你延迟一段固定的时间。 Tk 有一个运行循环,您首先调用 root.mainloop()。有什么方法可以让Tk 等待它完成一次主循环运行,而不是等待固定的时间,无论它需要几分之一毫秒还是需要 5000 毫秒?
  • @ArtOfWarfare,在root.mainloop() 调用之后放置你想要运行的代码怎么样?
【解决方案2】:

首先,您不应该使用 try/except 块来管理您的代码。其次,您正在使用e.configl.config 来切换颜色,应该是哪一种? (您应该为变量和对象考虑更好的命名约定以减少混淆)。

您可以检查用户输入的对象类型,然后有一个更好的管理流程,如下所示:

def sprawdzam():
    content = e.get()
    if content.isalnum():
        e.config(bg = 'green')    
    else:
        e.config(bg = 'red')
    time.sleep(2)
    e.config(bg = 'white')

这里我使用e 作为对象来更改颜色,但这可能不适用于您的代码,您应该确保使用正确的对象。

如您所见,睡眠和切换到白色是在 if/else 之外完成的,因为无论如何,您都会等待然后变成白色,无需编写两次代码。

【讨论】:

    【解决方案3】:
           for P in range(len(MaxTrace)):
               T = P + 1
               if T < len(MaxTrace):
                   PrevPlate  , PrevDot   = MaxTrace[P][0], MaxTrace[P][1] 
                   TargetPlate, TargetDot = MaxTrace[T][0], MaxTrace[T][1]
                   self.__window.update()
                   sleep(0.3)
                   #replace REGULAR token img to ACTIVE token img
                   GameCanvas.itemconfig(self.tokens[PrevPlate,PrevDot],image=self.DotImgActv[RivalColor])
                   self.__window.update()
                   sleep(0.2)
                   # mark Target vacation for move to by Yellow-RING img
                   self.tokens[TargetPlate, TargetDot]=GameCanvas.create_image(DotXY[TargetPlate,TargetDot],
                                                                               image=self.DotVacantImg  )
                   self.__window.update()
                   sleep(0.4)
                   GameCanvas.delete(self.tokens[PrevPlate,PrevDot])
                   self.__window.update()
                   sleep(0.3)
                   GameCanvas.itemconfig(self.tokens[TargetPlate, TargetDot],image=self.DotImg[RivalColor])
    

    【讨论】:

    • 您可以使用 root.update() ,而不是 sleep() 工作,并且比 .after(...) 做得更好。有一个每一步都有延迟的循环示例:
    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多