Как предотвратить создание дублирующих окон в tkinter - PullRequest
0 голосов
/ 28 мая 2019

Я использую TKInter для создания окна, которое отображает некоторую информацию, что-то вроде уведомления. Окно должно отображаться при нажатии кнопки «Просмотреть сведения» основного приложения.

Вот код окна, о котором я говорил. Метод Categories () вызывается при нажатии вышеупомянутой кнопки.

from tkinter import *
from tkinter import ttk

def Categories():


    roots = Tk()
    roots.minsize(600, 600)
    roots.title("Category Details")



    labelFrameCategory = ttk.LabelFrame(roots,text="Financial")
    labelFrameCategory.configure()
    labelFrameCategory.grid(column=0 ,row=0, pady=10, padx = 30 , sticky = W)


    labelClass = Label(labelFrameCategory, text="Documents related to finance")
    labelClass.grid(column=0, row=1)
    labelClass.config(font=("Courier", 15))

    roots.resizable(False, False)
    roots.mainloop()




Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я нажимаю кнопку, она создает новое окно, но оставляет текущее окно открытым. Поэтому, если я нажму 10 раз, откроется 10 похожих окон. Но я хочу, чтобы он открывал только 1 окно, независимо от того, сколько раз нажата кнопка, должно быть только 1 такое окно. Как это сделать?

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Похоже, ваша функция Categories вызывается из команды кнопки другого экземпляра Tk. Как правило, вы хотите избежать создания более 1 экземпляра Tk.

По вашему вопросу, есть много способов сделать это. Один из способов - просто отключить команду кнопки при нажатии и повторно активировать команду после уничтожения окна:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

def new_window():
    a.config(command="")
    roots = tk.Toplevel() #Use Toplevel instead if you simply want another window
    roots.minsize(600, 600)
    roots.title("Category Details")

    labelFrameCategory = ttk.LabelFrame(roots,text="Financial")
    labelFrameCategory.configure()
    labelFrameCategory.grid(column=0 ,row=0, pady=10, padx = 30 , sticky = tk.W)

    labelClass = tk.Label(labelFrameCategory, text="Documents related to finance")
    labelClass.grid(column=0, row=1)
    labelClass.config(font=("Courier", 15))

    roots.resizable(False, False)

    def quit_window():
        a.config(command=new_window)
        roots.destroy()

    roots.protocol("WM_DELETE_WINDOW",quit_window)

a = tk.Button(root,text="Click to open new win",command=new_window)
a.pack()

root.mainloop()

В качестве альтернативы вы также можете установить флаг, например window_open=True, и проверить флаг.

0 голосов
/ 28 мая 2019

вместо отключения кнопки,

почему бы вам не использовать имя свойства верхнего уровня?

это позволит вам использовать один экземпляр вашего верхнего уровня.

попробуйте код ниже.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

def new_window():
    #a.config(command="")
    #use instead name='something'
    roots = tk.Toplevel(name='goofy') #Use Toplevel instead if you simply want another window
    roots.minsize(600, 600)
    roots.title("Category Details")

    labelFrameCategory = ttk.LabelFrame(roots,text="Financial")
    labelFrameCategory.configure()
    labelFrameCategory.grid(column=0 ,row=0, pady=10, padx = 30 , sticky = tk.W)

    labelClass = tk.Label(labelFrameCategory, text="Documents related to finance")
    labelClass.grid(column=0, row=1)
    labelClass.config(font=("Courier", 15))

    roots.resizable(False, False)

    def quit_window():
        a.config(command=new_window)
        roots.destroy()

    roots.protocol("WM_DELETE_WINDOW",quit_window)

a = tk.Button(root,text="Click to open new win",command=new_window)
a.pack()

root.mainloop()
...