簡體   English   中英

Python Tkinter,在函數后銷毀頂層

[英]Python Tkinter, destroy toplevel after function

我使用Tkinter作為GUI使用python編程一些驅動器。 當我的機器運行時,我想向用戶顯示一個頂層窗口,其中包含一些信息,這些信息應在函數完成后關閉。 這是我的最小例子:

from Tkinter import *
import time


def button_1():
     window = Toplevel()
     window.title("info")
     msg = Message(window, text='running...', width=200)
     msg.pack()     
     time.sleep(5.0)
     window.destroy()

master = Tk()
frame = Frame(width=500,height=300)
frame.grid()
button_one = Button(frame, text ="Button 1", command = button_1)
button_one.grid(row = 0, column = 0, sticky = W + E)
mainloop()

主要問題是頂層窗口在5秒鍾結束后才出現。 有什么建議? 謝謝!

在GUI有時間更新之前啟動time.sleep(5) ,這就是為什么只在5秒結束后出現頂層的原因。 要更正此問題,可以在window.update_idletasks() time.sleep(5)之前添加window.update_idletasks() time.sleep(5)以強制更新顯示。

但是,正如Bryan Oakley在他的回答中指出的那樣,GUI在time.sleep(5)被凍結。 我想你的最終目標不是執行time.sleep而是耗費一些時間。 因此,如果您不想凍結GUI但不知道執行將花費多長時間,您可以在一個單獨的線程中執行您的函數,並定期檢查它是否在after使用after

import Tkinter as tk
import time
import multiprocessing

def function():
    time.sleep(5)


def button_1():
    window = tk.Toplevel(master)
    window.title("info")
    msg = tk.Message(window, text='running...', width=200)
    msg.pack()
    thread = multiprocessing.Process(target=function)
    thread.start()
    window.after(1000, check_if_running, thread, window)


def check_if_running(thread, window):
    """Check every second if the function is finished."""
    if thread.is_alive():
        window.after(1000, check_if_running, thread, window)
    else:
        window.destroy()


master = tk.Tk()
frame = tk.Frame(width=500,height=300)
frame.grid()
button_one = tk.Button(frame, text ="Launch", command=button_1)
button_one.grid(row = 0, column = 0, sticky = "we")
master.mainloop()

一般的經驗法則是你永遠不應該在運行GUI的線程中調用sleep 。原因是sleep完全按照它的說法運行,它會讓整個程序進入睡眠狀態。 這意味着它無法刷新窗口或對任何事件做出反應。

如果你想在一段時間后做一些事情,做正確的方法是用after 例如,這將在五秒后破壞窗口:

window.after(5000, window.destroy)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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