【问题标题】:Problems with disabling Menu in tkinter在 tkinter 中禁用菜单的问题
【发布时间】:2020-02-15 19:02:54
【问题描述】:

我在我的 Tkinter 应用程序中禁用菜单时遇到问题。只是我只想在某些页面上显示它们,我试图在我的应用程序的初始化功能中禁用它们,但这没有用,我试图在我的应用程序的显示框架功能中禁用它们但没有t 工作,我试图通过我的应用程序的起始页类禁用它们,因为我尝试使用 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()

【问题讨论】:

  • 这是我能做的最好的了
  • 我没有看到任何尝试禁用您的示例中的任何内容。你需要展示你尝试过的东西。
  • 我第一次尝试编辑它,我也在show frames函数下用if语句尝试过,但没有奏效。
  • 此代码不可能用于复制您的问题。它充满了错误。

标签: python-3.x tkinter menu


【解决方案1】:

这不是 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")

但是,由于该代码在程序启动时运行,因此这可能不会满足您的要求。我猜你希望代码在选择页面时运行。为此,请按照this answer 中的说明处理问题How would I make a method which is run every time a frame is shown in tkinter

【讨论】:

  • 我无法让第二部分在您引用另一个问题的地方工作,这是我所拥有的 ``class StartPage(tk.Frame): def __init__(self,parent,controller) : tk.Frame.__init__(self,parent) self.bind(">", self.on_show_frame(controller))
【解决方案2】:

出于可读性原因,第一次让我们清理它以更紧密地反映 PEP8 标准。

按照您的示例中应该添加的内容添加到导入中。

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

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

对于您的StartPage 课程,您将无法对菜单栏执行任何操作,原因有几个。首先,您没有将菜单栏定义为主 tk 类中的类属性。第二,您没有正确调用您的主服务器和容器,因此我更改了 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多