Python 延时Tkinter

Python 延时Tkinter,python,time,tkinter,Python,Time,Tkinter,我想在PyDev(Eclipse)Python2.75中创建一个图形窗口 我做了几件事,但我想做一个“入口”“眨眼”。它测试用户输入。 如果是整数,它应该闪烁绿色一秒钟,然后变成白色。但如果是一串其他东西,它应该闪烁红色,然后变成白色。我使用了一个time.sleep(),但它不能像我希望的那样工作 以下是我执行此操作的代码: def sprawdzam(): z = e.get() try: z = int(z) e.config(bg = '

我想在PyDev(Eclipse)Python2.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')

time.sleep
阻止程序的执行

使用

例如:

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()

首先,您不应该使用try/except块来管理代码。其次,您正在使用
e.config
l.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之外完成的,因为无论发生什么情况,您都将等待然后变为白色,无需编写两次代码。

对于范围内的p(len(MaxTrace)):
       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])
T=P+1 如果T
哦,我为我的英语道歉(我知道这不好)@Maq92,请发布另一个单独的问题。有没有办法让它只等待一次主循环的执行?我只想等待一个小部件刷新其显示,然后再运行其余的。@ArtOfWarfare,对不起。我不明白你的意思。你能用一个示例代码发布一个问题吗?这个答案允许你延迟一段固定的时间
Tk
有一个runloop,您可以通过调用
root.mainloop()
来启动它。有没有办法,不用等待固定的时间,只要让
Tk
等待它完成一次主循环的运行,不管是用一毫秒的几分之一还是5000毫秒?@ArtOfWarfare,把你想运行的代码放在
root.mainloop()
调用之后如何?你可以使用root.update(),而不是sleep(),而且比……之后做得更好。有一个每一步都有延迟的循环示例: