[英]TKINTER window gets freezes when after command is called
我有一個小的tkinter程序,它允許用戶輸入用戶的姓名和日期並將其存儲到文本文件中。
一切正常。 但是,當命令之后被執行,然后一切變得凍結為2000毫秒,我在下面的代碼有提及。 執行命令后,我無法單擊任何窗口小部件。
我已經閱讀了相同問題的解決方案,但沒有任何解決方案。
即使調用了“之后”命令,我如何也可以平穩地運行腳本?
碼
from Tkinter import *
def submit():
# Gets executed when submit button is clicked
label = Label(label_frame, text='SUBMITTED')
label.grid(row=3, column=0)
with open('file.txt', 'a') as f:
get_name = name_entry.get()
get_date = date_entry.get()
f.write('{} {}'.format(get_name, get_date))
root.update()
root.after(2000, label.grid_forget())
# Everything gets paused / freezed when it executes after command
root = Tk()
root.geometry('350x200')
frame = Frame()
label_frame = Frame()
# Setting name label and its entry
name_label = Label(frame, text='NAME')
name_entry = Entry(frame, width=30)
name_label.grid(row=0, column=0)
name_entry.grid(row=0, column=1)
# Setting date label and its entry
date_label = Label(frame, text='DATE')
date_entry = Entry(frame, width=30)
date_label.grid(row=1, column=0)
date_entry.grid(row=1, column=1)
# Setting submit button
submit_button = Button(frame, text='ADD', width=15, command=submit)
submit_button.grid(row=2, column=0, columnspan=5)
# Placing frames to window
frame.place(x=50, y=20)
label_frame.place(x=130, y=100)
root.mainloop()
請參閱從以下摘錄effbot上的文檔after
:
after(delay_ms, callback=None, *args)
注冊在給定時間后調用的警報回調。
此方法注冊一個回調函數,該函數將在給定的毫秒數后被調用。 Tkinter只保證不早於該回調被調用; 如果系統繁忙,則實際延遲可能會更長。
您也可以省略回調。 如果這樣做,則此方法僅等待給定的毫秒數,而不提供任何事件(與
time.sleep(delay_ms*0.001)
)。delay_ms
延遲(以毫秒為單位)。打回來
回調。 這可以是任何可調用對象。
你打電話時
root.after(2000, label.grid_forget())
您以毫秒為單位傳遞2000
,這很好。 您還將傳遞label.grid_forget()
作為回調。 但是, label.grid_forget()
不是應調用的對象,而是函數調用。 因此,它將被執行,並且其返回值將作為回調傳遞。 由於.grid_forget()
的返回值為None
,因此您實際上是在調用
root.after(2000, None)
在上面的信息中,您可以看到None
是回調的默認值,並且當您省略回調時,它僅等待給定的毫秒數,而不提供任何事件。 由於您將None
作為回調傳遞,因此您基本上省略了回調,因此tkinter會凍結。
您可以通過傳遞函數對象(可調用)作為回調而不是調用函數來解決此問題:
root.after(2000, label.grid_forget)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.