繁体   English   中英

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

[英]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.sleeptime.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM