![](/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.