簡體   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