在 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()
我在禁用我的 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 以来,这可能不会执行您想要的操作。我猜您希望在选择页面时将代码设为 运行。为此,请按照
首先,出于可读性原因,让我们清理一下以更准确地反映 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()