python-3.x - Python Tkinter 菜单栏未显示
问题描述
我有以下不显示菜单的代码。它一直有效,直到我将菜单移到课堂上。我添加了self.configure(menu=self.menu)
基于这个问题,但它仍然不起作用。打印语句显示菜单构建代码正在运行。
我是否正确获得了对父母的参考?
如果我错误地从父级而不是控制器引用事件处理程序,则错误表明这是一个 Tk() 对象。
我在 Ubuntu 上使用 python3.6 和 tkinter8.6。
import tkinter as tk
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.main = MainWindow(self)
self.menu=MainMenu(self, self.main)
self.configure(menu=self.menu)
self.minsize(300,300)
self.geometry("500x500")
self.protocol('WM_DELETE_WINDOW', self.main.on_exit)
self.main.pack(fill="both", expand=True)
class MainWindow(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
def on_exit(self):
print("exiting...")
self.parent.destroy()
def on_choose_port(self):
print("on_choose_port selected")
class MainMenu(tk.Menu):
def __init__(self, parent, controller):
tk.Menu.__init__(self, master=None)
self.master = parent
self.controller = controller
print("building menu bar")
self.menubar = tk.Menu(self.master)
self.menubar.add_cascade(label="File", menu=self.file_menu(self.menubar))
self.menubar.add_cascade(label="Settings", menu=self.settings_menu(self.menubar))
def file_menu(self, parent):
print("building file menu...")
file_menu = tk.Menu(parent)
file_menu.add_command(label="Exit", command=self.controller.on_exit)
return file_menu
def settings_menu(self, parent):
print("building settings menu...")
settings_menu = tk.Menu(parent)
settings_menu.add_command(label="Port", command=self.controller.on_choose_port)
return settings_menu
if __name__ == "__main__":
App().mainloop()
解决方案
问题是MainMenu
继承自Menu
,但也创建了一个包含所有其他菜单项的内部菜单。您附加MainMenu
到根窗口,但您已将所有级联菜单附加到隐藏self.menubar
菜单。
换句话说,您需要将级联菜单添加到self
而不是添加到self.menubar
,并且您根本不需要创建self.menubar
。
class MainMenu(tk.Menu):
def __init__(self, parent, controller):
tk.Menu.__init__(self, master=None)
self.master = parent
self.controller = controller
print("building menu bar")
self.add_cascade(label="File", menu=self.file_menu(self))
self.add_cascade(label="Settings", menu=self.settings_menu(self))
推荐阅读
- wordpress - 通知作者发布状态更改
- javascript - 产生不停止 ember 并发任务中的流程
- jquery - 使用 jquery 验证禁用按钮
- html - 如何在 SVG 的矩形内设置标题标签的样式?
- javascript - 如何在节点 js 中从与 localhost:8080/?data=test 相邻的 URL 读取数据
- nginx - 如何通过 nginx 使根目录子文件夹可用?
- java - Java Web 应用程序中的 LDAPS 和 LDAP 签名以及基于 LDAP 通道绑定的支持
- python - 在某个单词之后从行中删除单词
- spring-boot - 未找到插件“org.codehaus.mojo:jaxb2-maven-plugin:3.6.3”
- python - 将数据帧字典转换为 Pandas MultiIndex 数据帧