简体   繁体   English

为什么此tkinter菜单小部件的一部分没有显示?

[英]Why doesn't a part of this tkinter Menu widget not show up?

I am creating a Text editor and I am trying to edit the default Mac Application menu. 我正在创建一个文本编辑器,并且试图编辑默认的Mac Application菜单。 Mac应用程序菜单 <—The Menu <-菜单

I followed this tutorial to edit it and it works fine on its own like 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()

But when I try add in my menubar items for my text editor in another script, it will only display the text editor bits and not the edited application menu. 但是,当我尝试在另一个脚本中为文本编辑器添加菜单栏项时,它将仅显示文本编辑器位,而不显示已编辑的应用程序菜单。

How can I get both to show at the same time? 如何让两者同时显示?

Problem code: 问题代码:

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()

The example code from the tutorial does not work all the way for me (at least on my current OS 10.10). 本教程中的示例代码对我而言并非一路都有效(至少在当前的OS 10.10上如此)。 I wouldn't worry about changing the label manually if you are planning to make this a stand alone app. 如果您打算使它成为一个独立的应用程序,我不会担心手动更改标签。 If you make this a stand alone app with py2app or cx_freeze, the name of you app you set in your setup.py script will show in the menubar as YourAppName ; 如果使用py2app或cx_freeze将此应用程序制作为独立应用程序,则在setup.py脚本中设置的应用程序名称将在菜单栏中显示为YourAppName and the same goes for the about YourAppName . about YourAppName

There is a partial solution; 有一个局部的解决方案。 reorder your code. 重新排序您的代码。 If you move the section that creates the About this app object just after the menu is created, it will work. 如果在创建菜单后立即移动创建About this app对象的部分,它将起作用。 Here is how it would look in your code: 这是在代码中的样子:

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...

Unfortunately, this does not change the name of the main menubar item. 不幸的是,这不会更改主菜单栏项的名称。 But if you make this an app as I decried above, you don't need to worry about this. 但是,如果您像我上面所说的那样将其设置为应用程序,则无需担心。

EDIT 编辑

I found a potential solution that may help you change the the default Python menu item to whatever you want. 我发现了一个潜在的解决方案,可以帮助您将默认的Python菜单项更改为所需的任何内容。 Go to this post I found. 转到我发现的帖子

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM