Как удалить всплывающее окно в tkinter? - PullRequest
1 голос
/ 12 июля 2020

У меня появляется последовательность всплывающих окон windows. Я намеревался закрыть окно, как только выполню желаемую задачу. Я использую кнопку «askokcancel», чтобы пользователи подтвердили, завершено ли действие. Проблема в том, что каждый раз, когда пользователь нажимает кнопку «ОК», фокус возвращается в главное стартовое окно, а остальная часть всплывающего окна windows уходит в фоновый режим, оставаясь активным. Я хочу либо закрыть всплывающее окно windows, либо сохранить фокус на втором последнем окне. Ниже мой код:

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()

Из этого придуманного примера я хочу каким-то образом закрыть окно номер 2 после того, как пользователь нажмет OK, или сохранить фокус на окне 2, а не на окне 1. Пожалуйста, помогите

1 Ответ

1 голос
/ 12 июля 2020

Нет возможности закрыть окно сообщения, хотя вы можете легко создать свое собственное. Вам просто нужно создать новое окно 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 для легкого уничтожения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...