Сохранить состояние страницы верхнего уровня в tkinter - PullRequest
1 голос
/ 08 октября 2019

Я пытался создать страницу выбора в верхней части моей корневой страницы в моем приложении, используя функцию tk.Toplevel() в tkinter. На новой странице есть кнопка «Добавить», которая создает новую опцию на странице выбора. Упрощенная версия моего кода показана ниже:

import tkinter as tk


class demo:
    lines = []
    def __init__(self, master):
        self.master = master
        self.add_button = tk.Button(self.master, text="+",
                                     command=self.add,
                                     width=3)

        self.add_button.pack()
        self.lines = []


    def add(self):
        line = []
        line.append(tk.Checkbutton(self.master, variable=tk.StringVar(value="0"))) # 5
        self.lines.append(line)
        self.show()
    def show(self):
        self.add_button.pack()
        for l in self.lines:
            l[0].pack()

def new_window(master):        
    NewWindow = tk.Toplevel(master)
    demo(NewWindow)            


root = tk.Tk()

tk.Button(root, text="selection page",
                             command=lambda: new_window(root),
                             width=30).pack()

root.mainloop()

Я хочу, чтобы при закрытии новой страницы она сохраняла свое состояние, т.е. когда я создала несколько флажков и заполняла некоторые из них при закрытииокно остается прежним;но он начинается заново.

Как я могу это реализовать?

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Чтобы достичь желаемого с минимальными изменениями, вы можете скрыть Toplevel вместо того, чтобы закрывать его:

import tkinter as tk

class demo:
    ...

def new_window(master):
    global NewWindow
    if not NewWindow:
        NewWindow = tk.Toplevel(master)
        NewWindow.wm_protocol("WM_DELETE_WINDOW",NewWindow.iconify)
        demo(NewWindow)
    else:
        NewWindow.deiconify()

root = tk.Tk()
NewWindow = None
...

root.mainloop()
1 голос
/ 08 октября 2019

Таким образом, для отслеживания только в том случае, когда вы открыли, вы хотите использовать withdraw и deiconify. Вы также захотите управлять протоколом закрытия окон, чтобы он вместо этого выводил окно.

Посмотрите на этот пример и дайте мне знать, если у вас есть какие-либо вопросы.

import tkinter as tk


class Demo(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.hidden_status = False
        self.protocol("WM_DELETE_WINDOW", self.toggle_top)
        self.lines = []
        self.add_button = tk.Button(self, text="+", command=self.add, width=3)
        self.add_button.pack()

    def add(self):
        self.lines.append(tk.Checkbutton(self, variable=tk.StringVar(value="0")))
        self.lines[-1].pack()

    def toggle_top(self):
        if self.hidden_status:
            self.deiconify()
            self.hidden_status = False
        else:
            self.withdraw()
            self.hidden_status = True


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.top = Demo()
        self.top.toggle_top()
        tk.Button(self, text="selection page", command=self.top.toggle_top, width=30).pack()


if __name__ == '__main__':
    App().mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...