为什么不显示此tkinter Menu小部件的一部分?

时间:2015-10-24 06:01:39

标签: python macos menu tkinter

我正在创建一个文本编辑器,我正在尝试编辑默认的Mac应用程序菜单。Mac application menu < -The Menu

我按照this教程编辑它,它本身就可以正常工作:

from Tkinter import *
root=Tk()
menubar = Menu(root)
appmenu = Menu(menubar, name='apple')
menubar.add_cascade(menu=appmenu)
appmenu.add_command(label='About My Application')
appmenu.add_separator()
root['menu'] = menubar
root.mainloop()

但是当我尝试在另一个脚本中为我的文本编辑器添加我的菜单栏项时,它只显示文本编辑器位而不是编辑的应用程序菜单。

  

如何让两者同时显示?

问题代码:

from Tkinter import *
class Main(object):
    def __init__(self, root):
        root.title("PyText")
        #Text editor menu items
        self.m1=Menu(root)

        self.fm=Menu(self.m1, tearoff=0)
        self.fm.add_command(label="New", command=self.saveas)
        self.fm.add_command(label="Open", command=self.saveas)
        self.fm.add_command(label="Save", command=self.saveas)
        self.fm.add_command(label="Save as...", command=self.saveas)
        self.fm.add_command(label="Close", command=self.saveas)
        self.fm.add_separator()
        self.fm.add_command(label="Exit", command=root.quit)
        self.m1.add_cascade(label="File", menu=self.fm)

        self.editmenu = Menu(self.m1, tearoff=0)
        self.editmenu.add_command(label="Undo", command=self.saveas)
        self.editmenu.add_separator()
        self.editmenu.add_command(label="Cut", command=self.saveas)
        self.editmenu.add_command(label="Copy", command=self.saveas)
        self.editmenu.add_command(label="Paste", command=self.saveas)
        self.editmenu.add_command(label="Delete", command=self.saveas)
        self.editmenu.add_command(label="Select All", command=self.saveas)
        self.editmenu.add_separator()
        self.m1.add_cascade(label="Edit", menu=self.editmenu)
        #Problem code here
        self.appmenu = Menu(self.m1, name="apple", tearoff=0)
        self.m1.add_cascade(menu=self.appmenu)
        self.appmenu.add_command(label="About PyText")
        self.appmenu.add_separator()

        root.config(menu=self.m1)



        self.t1=Text(root)
        self.t1.config(width=90, height=40)
        self.t1.grid()

    def saveas(self):
        self.filewin = Toplevel()
        self.filewin.title("Name")
        self.e1=Entry(self.filewin)
        self.e1.grid()
        self.button = Button(self.filewin, text="Save", command=self.save)
        self.button.grid()

    def save(self):
        with open(self.e1.get(), "w") as f: # this instance variable can be accessed
            f.write(self.t1.get('1.0', 'end'))


root = Tk()
app = Main(root)
root.mainloop()

1 个答案:

答案 0 :(得分:2)

本教程中的示例代码并不能完全适用于我(至少在我当前的OS 10.10中)。如果您打算将其作为一个独立的应用程序,我不会担心手动更改标签。如果您使用py2app或cx_freeze将其设为独立应用,则您在setup.py脚本中设置的应用名称将在菜单栏中显示为YourAppName; about YourAppName也是如此。

有部分解决方案;重新排序您的代码。如果在创建菜单后移动创建About this app对象的部分,它将起作用。以下是代码中的外观:

class Main(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.title("PyText")
        #Text editor menu items
        self.m1=Menu(self)

        self.appmenu = Menu(self.m1, name="apple")
        self.m1.add_cascade(menu=self.appmenu)
        self.appmenu.add_command(label="About PyText")
        self.appmenu.add_separator()

        # Other menu bar code...

不幸的是,这并没有改变主菜单栏项的名称。但是,如果您按照我上面的谴责将其设为应用程序,则无需担心这一点。

<强> 修改

我找到了一个可能的解决方案,可以帮助您将默认的Python菜单项更改为您想要的任何内容。转到this post我找到了。