Tkinter - Как изменить виджет в классе из другого класса? - PullRequest
0 голосов
/ 26 мая 2018

Я хочу иметь возможность изменить меню на неактивное во время LoginPage, но затем стать активным после NextPage, есть ли способ сделать это извне класса Application?

import tkinter as tk
from tkinter import ttk


class Application(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        window = tk.Frame(self)
        window.pack(side="top", fill="y", expand=True)

        self.menu = tk.Menu(window)
        file_menu = tk.Menu(self.menu, tearoff=0)
        file_menu.add_command(label="Temp")
        file_menu.add_separator()
        file_menu.add_command(label="Exit", command=quit)
        self.menu.add_cascade(label="File", menu=file_menu)
        tk.Tk.config(self, menu=self.menu)

        # Disable the menu for LoginPage
        self.disable_menu("File")

        self.frames = {}
        for frames in (LoginPage, NextPage):
            frame = frames(window, self)
            self.frames[frames] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(LoginPage)

    def enable_menu(self, sub_menu):
        self.menu.entryconfig(sub_menu, state="normal")

    def disable_menu(self, sub_menu):
        # Can this function be called from the class NextPage to disable the menu when not logged in?
        self.menu.entryconfig(sub_menu, state="disabled")

    def show_frame(self, controller):
        frame = self.frames[controller]
        frame.tkraise()


class LoginPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        button = ttk.Button(self, text="Next Page", command=lambda: controller.show_frame(NextPage))
        button.pack()


class NextPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        # Enable menu bar here after logged in
        label = ttk.Label(self, text="Temporary")
        label.pack()


application = Application()
application.mainloop()

Я пробовал: Application.disable_menu(self, sub_menu="File") в классе NextPage, но там написано, что 'NextPage' object has no attribute 'menu', есть ли способ заставить это работать?

...