簡體   English   中英

調用命令后,TKINTER窗口凍結

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM