我正在关注一个tutorial,并且在完成所说的内容时收到了不同的结果。
我希望菜单栏显示在实际的tkinter应用程序窗口中,就像在教程中一样。他正在使用Windows。它反过来显示在计算机的实际顶部菜单栏上。如果有所作为,我正在使用Mac。有办法解决这个问题吗?
这是我的代码:
from tkinter import *
def doNothing():
label1 = Label(root, text="Doing nothing")
label1.pack()
root = Tk()
mainmenu = Menu(root)
root.config(menu=mainmenu)
filemenu = Menu(mainmenu)
mainmenu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New Project", command=doNothing)
filemenu.add_command(label="New", command=doNothing)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=doNothing)
editmenu=Menu(mainmenu)
mainmenu.add_cascade(label="Edit", menu=editmenu)
editmenu.add_command(label="Redo", command=doNothing)
root.mainloop()
答案 0 :(得分:1)
如果有所作为,我正在使用Mac。有办法解决这个问题吗?
是的,它有所不同。 Tk
仍然不支持样式菜单。根据{{3}}:
您会注意到最近的一些Linux发行版,许多应用程序在活动时会在屏幕顶部显示其菜单,而不是在窗口本身。 Tk还不支持这种菜单。
下面再说:
在Mac OS X上,屏幕顶部有一个菜单栏,每个窗口共享一个菜单栏。就你的Tk程序而言,每个窗口仍然有自己的菜单栏;当您在窗口之间切换时,Tk会自动确保在屏幕顶部显示正确的菜单栏。如果您没有为特定窗口指定菜单栏,Tk将使用与根窗口关联的菜单栏;您现在已经注意到,当您的Tk应用程序启动时,会自动为您创建。
然后它给了我们一个提示:
因为在Mac OS X上所有窗口都有一个菜单栏,所以确保为每个窗口或根窗口的后备菜单栏定义一个菜单非常重要。否则,你最终会得到"内置" menubar,包含仅在将命令直接输入解释器时使用的菜单。
此外,TkDocs
:
Tk菜单命令挂钩到Mac OS X全局菜单栏中。如果您想要一个不使用全局菜单栏的菜单,则必须编写自己的顶级菜单。
如果您有兴趣在窗口上实现菜单,this issue says是一个询问如何删除顶部菜单的人:
菜单中显示的名称由OS X从正在执行的应用程序包中的应用程序名称派生。如果您不将程序打包为OS X应用程序包,则将使用默认值;在Python OS X框架构建的情况下,Python在框架内提供了一个Python.app,以允许Python进程自动升级到完整的OS X GUI过程。
可能最简单的方法是使用py2app
创建一个具有所需名称的双击应用程序。在Stackoverflow上对类似问题的回答中有here。 an example中记录了一些旧的但仍然相关的详细信息。
总的来说,根据Tcl/TkAqua FAQ
在Macintosh上,每当顶层位于前面时,此菜单的级联项目将出现在主监视器顶部的菜单栏中。在Windows和Unix上,此菜单的项目将显示在窗口顶部的菜单栏中。这些菜单将根据其平台的界面指南
运行...
如上所述,菜单栏在不同平台上的表现可能不同。这方面的一个例子涉及菜单内的检查按钮和无线电按钮的处理。虽然允许将这些菜单元素放在菜单栏上,但由于系统限制,它们可能无法在某些平台上绘制指示符。
答案 1 :(得分:1)
不,这是不可能的。至少,没有一个与其他操作系统上的菜单栏完全一样。
您可以使用带有menubuttons的框架制作菜单,并将其打包在窗口顶部。它不会像原生菜鸟那样完全相同,而且你的屏幕顶部仍然会有一个空白的菜单。