tkinter确认弹出窗口和回调弹出窗口



我正在尝试使用tinter和Python3创建两种弹出窗口。首先是一个简单的等待,直到ok按钮按下消息。另一个在后台运行进程并显示弹出窗口,直到进程完成。我有以下相同的代码:

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。

不能将time.sleep与tkinter一起使用,因为它会阻塞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()

现在按照您的问题中的描述运行。

我认为这符合您的要求。只有一个对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)

最新更新