【问题标题】:How to delete popup window in tkinter?如何在 tkinter 中删除弹出窗口?
【发布时间】:2020-07-12 07:03:37
【问题描述】:

我有一系列弹出窗口。我打算在完成所需任务后关闭窗口。我正在使用“askokcancel”按钮让用户确认活动是否已完成。问题是,每次用户按下确定时,焦点都会回到主启动窗口,其余弹出窗口会在保持活动状态的同时进入后台。我想关闭弹出窗口或将焦点保持在倒数第二个窗口。以下是我的代码:

import tkinter as tk
from tkinter import ttk, StringVar, messagebox
from tkinter.filedialog import askopenfilename
from mytest import *
from tkinter import *
        
class myclass:
    def __init__(self, master):
        self.master = master
        self.frame1 = tk.Frame(self.master)
        self.button1 = tk.Button(self.frame1, text = 'select me first', width = 25, command = self.buttonFunc)
        self.button1.pack()
        self.quitButton = tk.Button(self.frame1, text = 'Quit', width = 25, command = self.close_windows1)
        self.quitButton.pack()
        self.frame1.pack()
        self.master.geometry("200x200+60+60")
        
    def buttonFunc(self):
        self.top = tk.Toplevel(self.master)                       
        self.button2 = tk.Button(self.top,text="Select second",command=self.anotherButtonFunc)
        self.button2.pack()
        self.quitButton = tk.Button(self.top, text = 'Quit', width = 25, command = self.close_windows2)
        self.quitButton.pack() 
        self.master.geometry("200x200+60+60")

    def anotherButtonFunc(self):    

        self.top2 = tk.Toplevel(self.top)
        self.newClass = myClassExt(self.top2)
        
    def close_windows1(self):
        self.master.destroy() 
        
    def close_windows2(self):
        self.top.destroy() 

class myClassExt():
    def __init__(self, top2):
        self.top3 = top2
        self.frame2 = tk.Frame(self.top3)
        self.button3 = tk.Button(self.frame2, text = 'select me third', width = 25, command = self.buttonFunc)
        self.button3.pack()
        self.quitButton = tk.Button(self.frame2, text = 'Quit', width = 25, command = self.close_windows4)
        self.quitButton.pack()
        self.frame2.pack()
        self.top3.geometry("200x200+60+60")

    def buttonFunc(self):        
        ok = messagebox.askokcancel(message='Press OK to Confirm?')
        if not ok:
            pass
        else:
            messagebox.showinfo("Success","Well done")
            self.close_windows4()
            
    def close_windows4(self):
        self.top3.destroy() 
        
        
if __name__ == "__main__":
    root = tk.Tk()
    myclass = myclass(root)
    root.mainloop()

从这个虚构的例子中,我想在用户按下 OK 后关闭 2 号窗口,或者将焦点保持在 2 号窗口而不是 1 号窗口上。请指导

【问题讨论】:

    标签: python tkinter messagebox


    【解决方案1】:

    没有办法关闭消息框,尽管您可以轻松地制作自己的消息框。您只需要创建一个新的 tkinter 窗口,并设置图像、标题和文本,然后添加一个关闭按钮,然后返回 tk 窗口。正是出于这个原因,我自己做了一个这样的函数。这是函数:

    def mymessage(title, text, spacing = 25, buttonText = "Close", image = None):
        tk2 = Tk()
        tk2.resizable(0, 0)
        tk2.title(title)
        if image != None:
            image = Label(tk2, image = PhotoImage(file = image))
            image.pack()
        spacer = Frame(tk2, relief = FLAT, bd = 0, width = 200, height = 25)
        spacer.pack()
        label = Label(tk2, text = text)
        label.pack()
        button = Button(tk2, text = buttonText, width = 5, height = 1, command = tk2.destroy)
        button.pack()
        return tk2
    

    函数调用后返回tk窗口,方便销毁。

    【讨论】:

    • 你不应该创建一个新的Tk()对象; Toplevel() 效果更好。