在 tkinter 中禁用菜单的问题

Problems with disabling Menu in tkinter

我在禁用我的 Tkinter 应用程序中的菜单时遇到问题。只是我只想在某些页面上显示它们,我试图在我的应用程序的初始化功能中禁用它们,但这没有用,我试图在我的应用程序的显示框架功能中禁用它们但是没有'不起作用,我试图通过我的应用程序的起始页 class 禁用它们,因为我尝试使用 self.menubar , parent.menubar 和 controler.menubar;但似乎没有任何效果。我只会在每个单独的页面上对它们进行编码,但这是我发现甚至可以在任何页面上显示它们的唯一方法。任何帮助将非常感激。

class App(tk.Tk):

    def __init__(self,*args,**kwargs):
        tk.Tk.__init__(self,*args,**kwargs)

        container = tk.Frame(self)
        container.pack(side='top',fill='both',expand= True)
        container.grid_rowconfigure(0,weight = 1)
        container.grid_columnconfigure(0,weight = 1)

        menubar = tk.Menu(container)
        file = tk.Menu(menubar, tearoff = 0)
        file.add_command(label='Exit', command = quit)
        menubar.add_cascade(label='File',menu=file)
        tk.Tk.config(self, menu=menubar)

        self.frames = {}

        for F in (StartPage):
            frame = F(container,self)
            self.frames[F] = frame
            frame.grid(row=0,column=0,sticky='nsew')
            page = F
        self.show_frame(StartPage)

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

class StartPage(tk.Frame):

    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        menubar.add_cascade(label='File',state=DISABLED)
        label = ttk.Label(self, text='Start', font = LARGE_FONT).pack()

main = App()
main.mainloop()

这不是 tkinter 问题,而是 python 的工作方式 - 要修改对象,您需要引用该对象。这对 tkinter 小部件来说是正确的,就像对 python.

中的字典、字符串或任何其他对象一样。

在这种情况下,对象是主应用程序的一部分。您首先需要保存对它的引用:

class App(tk.Tk):

    def __init__(self,*args,**kwargs):
        ...
        self.menubar = tk.Menu(container)
        ...

在后面的代码中,您现在可以从 controller 变量访问此菜单,该变量是对 App:

实例的引用
class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        controller.menubar.entryconfigure('File',state="disabled")

但是,自程序启动时代码 运行s 以来,这可能不会执行您想要的操作。我猜您希望在选择页面时将代码设为 运行。为此,请按照 to the question

中的说明进行操作

首先,出于可读性原因,让我们清理一下以更准确地反映 PEP8 标准。

添加到导入中,因为那些应该在您的示例中。

我们需要将 (StartPage) 中的括号替换为这样的括号 [StartPage]。这是因为括号中的单个值被视为不带括号的单个值,因此您试图遍历对象而不是列表。

您应该更具体地说明您正在配置什么。而不是调用 tk.tk.config()self.config(menu=self.menubar).

对于您的 StartPage class,出于多种原因,您将无法对菜单栏执行任何操作。首先,您没有在主 tk class 中将菜单栏定义为 class 属性。第二,你没有正确调用你的主人和容器,所以我改变了 init 中的参数名称,以更好地反映我们正在使用的东西,这样你就可以看到你需要调用什么。

最后是问题的关键,如果您需要使用禁用菜单的问题entryconfig()

参见下面清理后的代码:

import tkinter as tk
import tkinter.ttk as ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        container = tk.Frame(self)
        container.pack(side='top', fill='both', expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.menubar = tk.Menu(container)
        self.config(menu=self.menubar)
        file = tk.Menu(self.menubar, tearoff=0)
        file.add_command(label='Exit', command=quit)
        self.menubar.add_cascade(label='File', menu=file)

        self.frames = {}
        for F in [StartPage]:
            frame = F(self, container)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky='nsew')
            page = F
        self.show_frame(StartPage)

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


class StartPage(tk.Frame):
    def __init__(self, master, container):
        tk.Frame.__init__(self, container)
        master.menubar.entryconfig('File', state='disabled')
        ttk.Label(self, text='Start').pack()


main = App()
main.mainloop()