![](/img/trans.png)
[英]Trying to write a tkinter popup with dynamic text and confirmation button
[英]tkinter confirmation popup and callback popup
我正在嘗試使用 tinter 和 Python3 創建兩種彈出窗口。 首先是一個簡單的等待,直到確定按鈕按下消息。 另一個在后台運行進程並顯示彈出窗口,直到進程完成。 我有以下相同的代碼:
from tkinter import *
import time
def open_window():
popup = Toplevel()
ok_button = Button(popup, text="OK", command=popup.destroy)
ok_button.pack()
popup.mainloop()
def open_event_window(message, on_event):
NORM_FONT = ("Helvetica", 15)
popup = Toplevel()
label = Label(popup, text=message, font=NORM_FONT)
label.pack(side="top", fill="x", pady=10)
popup.after(1, lambda: popup.focus_force())
popup.wm_attributes("-topmost", 1)
popup.focus_force()
popup.update()
try:
on_event()
except:
raise
finally:
try:
popup.destroy()
except:
pass
def func():
print(">>> ", 1)
time.sleep(5)
print(">>> ", 2)
root = Tk()
root.withdraw()
open_window()
time.sleep(5)
open_event_window("here", func)
print("-111111")
time.sleep(5)
使用上面的代碼,ok 提示有效,但回調提示沒有出現。 如果我嘗試直接使用 Tk() 而不是 TopLevel() 兩個提示都有效,但是第一個提示僅在第二個提示打開時關閉,這不是我們想要的。 對於給定的代碼,我想要的流程是:打開 ok 提示並在 ok 按下時關閉 -> 睡眠 5 秒 -> 打開回調提示並運行 5 秒並關閉 -> 睡眠 5 秒 -> 退出。
任何指導將不勝感激。 謝謝。
注意:在每個函數中使用 Tk() 調用而不是 TopLevel 的代碼在 Python2 中正常工作,但我試圖在發生這種情況的地方使用 Python3。
我認為這符合你所說的你想要的。 只有一次調用mainloop()
並且open_event_window()
函數現在會銷毀root
而不僅僅是popup
因此mainloop()
將返回並且執行之后的行。 我添加了一個switch_windows()
函數來在延遲后在兩個彈出窗口之間轉移控制。
from tkinter import *
import time
def open_window():
popup = Toplevel()
ok_button = Button(popup, text="OK", command=lambda: switch_windows(popup))
ok_button.pack()
def switch_windows(_from):
_from.after(3000, open_event_window, "here", func)
_from.withdraw()
def open_event_window(message, on_event):
NORM_FONT = ("Helvetica", 15)
popup = Toplevel()
label = Label(popup, text=message, font=NORM_FONT)
label.pack(side="top", fill="x", pady=10)
popup.after(1, lambda: popup.focus_force())
popup.wm_attributes("-topmost", 1)
popup.focus_force()
popup.update()
try:
on_event()
except:
raise
finally:
try:
root.destroy()
except:
pass
def func():
print(">>> ", 1)
time.sleep(5)
print(">>> ", 2)
root = Tk()
root.withdraw()
open_window()
root.mainloop()
print("-111111")
time.sleep(5)
您不能將time.sleep
與time.sleep
一起使用,因為它會阻止 GUI 進程。 使用root.after(delay_in_milliseconds, callback)
代替。
def close_window(popup):
popup.destroy()
root.after(5000, lambda:open_event_window("here", func)) #Wait 5 seconds and open next window
def open_window():
popup = Toplevel(root)
ok_button = Button(popup, text="OK", command=lambda:close_window(popup))
ok_button.pack()
popup.mainloop()
def open_event_window(message, on_event):
NORM_FONT = ("Helvetica", 15)
popup = Toplevel(root)
label = Label(popup, text=message, font=NORM_FONT)
label.pack(side="top", fill="x", pady=10)
popup.after(1, lambda: popup.focus_force())
popup.wm_attributes("-topmost", 1)
popup.focus_force()
popup.update()
try:
on_event()
except:
raise
finally:
popup.destroy()
root.after(5000, root.destroy) #Wait 5 seconds before exiting
def func():
print(">>> ", 1)
time.sleep(5)
print(">>> ", 2)
root = Tk()
root.withdraw()
open_window()
root.mainloop()
現在按照您的問題中的描述運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.