问题描述
因此,我具有以下功能,该功能应该忘记一个按钮,迭代一个乐谱,等待一秒钟,然后将按钮放回原处。
def iteration():
global score
#should hide button
b1.place_forget()
#raise score
score += 1
label.config(text = score)
#wait one second
sleep(1)
#bring button back
b1.place(relx = 0.3,y = 30)
相反,place_forget()直到完成所有其他操作后才运行,从而导致按钮从不闪烁,并等待一秒钟再遍历分数。为什么事情按此顺序发生,我该如何解决?这是我其余的代码:
from tkinter import *
from time import sleep
global score
score = 0
def iteration():
global score
#should hide button
b1.place_forget()
#raise score
score += 1
label.config(text = score)
#wait one second
sleep(1)
#bring button back
b1.place(relx = 0.3,y = 30)
root = Tk()
root.geometry("150x100")
#make label
label = Label(root,text = score)
# place in the window
label.place(relx=0.4,y=5)
#make and place button 1
b1 = Button(root,text = "hide text",command = lambda: iteration())
b1.place(relx = 0.3,y = 30)
# make and place button 2
b2 = Button(root,text = "retrieve text",command = lambda: iteration())
b2.place(relx = 0.3,y = 50)
# Start the GUI
root.mainloop()
解决方法
我认为该过程正在发生,但是您的sleep(1)
正在冻结GUI,因此您看不到它。
- 要么替换
sleep(1)
,然后将小部件替换为after()
,可能会得到您想要的效果,例如:
def iteration():
global score
#should hide button
b1.place_forget()
#raise score
score += 1
label.config(text = score)
#wait one second and bring button back
root.after(1000,lambda: b1.place(relx = 0.3,y = 30))
after()
防止GUI滞后一秒钟,而该时间本应隐藏和显示。
- 否则,请像这样使用
threading
:
import threading
.... #same old codes
b1 = Button(root,text = "hide text",command =lambda: threading.Thread(target=iteration).start())
现在sleep(1)
不会导致GUI滞后,因为它不在tkinter线程中。
- 否则,您可以将其与
update()
配合使用,但GUI可能仍被冻结,但它会更新,按钮“闪烁”,例如:
root.update()
sleep(1)
#bring button back
b1.place(relx = 0.3,y = 30)