2017-09-12 83 views
-1

我希望此代碼創建一個彈出窗口,它在4秒後破壞自己,但也可以通過按鈕關閉。Python關閉Toplevel窗口錯誤

def error(self): 
    top = Toplevel() 
    top.after(4000, lambda: top.destroy()) 
    center_window(300,100, top) 
    top.title("Error") 
    Label(top, text="Please enter a valid code", height=3, width=200).pack() 
    ok = Button(top, text="OK", command=top.destroy) 
    ok.pack() 
    ok.bind("<Return>", lambda a: top.destroy()) 
    ok.focus_set() 

我已經運行的代碼,它工作的時間細90%,除了有時它拋出這個錯誤:

TypeError: <lambda>() takes exactly 1 argument (0 given) 

我已經做了研究,指出它是Tkinters線程。我不確定這是否是我的問題,但當我拿出這行代碼:

top.after(4000, lambda: top.destroy()) 

它似乎工作。如果有人能幫助我,我已經自學了我所瞭解的python,所以我確信我的學習存在漏洞。我想我可能需要以某種方式使用主執行線程來銷燬這個窗口,或者創建我自己的自定義窗口小部件。任何幫助表示讚賞。

+0

這與線程完全沒有關係。 Tkinter始終以單線程運行。 –

回答

1

使用after或bind時,不需要使用lambda。 例如,使用:

top.after(4000, top.destroy) 

它直接引用函數top.destroy。

0

您可以直接綁定函數的調用,而不是使用Lambda:

top.after(4000, top.destroy) 
... 
    ok.bind("<Return>", top.destroy) 

你會使用lambda,舉例來說,如果你需要的參數傳遞給函數;這裏並不是這種情況。