“如何替换”;关于Tkinter“;OSX上Python中的菜单

“如何替换”;关于Tkinter“;OSX上Python中的菜单,python,menu,tkinter,Python,Menu,Tkinter,编辑:我指的是OSX应用程序菜单,其中包含关于和首选项菜单项(以及其他项) 也许对于知道正确搜索词的人来说,这将是另一个简单的方法,但在花了数小时在空闲状态下跟踪代码并搜索网络后,我还不能很好地连接这些点 我正在尝试替换Python中的标准About菜单。IDLE至少部分地做到了这一点;菜单仍然命名为“About Python”,但它显示了IDLE About窗口。当从Wing IDE运行时(在X11下),idle不显示其“关于”窗口,并且出于某种原因idle不想调试idle.py 我已经能够将

编辑:我指的是OSX应用程序菜单,其中包含关于和首选项菜单项(以及其他项)

也许对于知道正确搜索词的人来说,这将是另一个简单的方法,但在花了数小时在空闲状态下跟踪代码并搜索网络后,我还不能很好地连接这些点

我正在尝试替换Python中的标准About菜单。IDLE至少部分地做到了这一点;菜单仍然命名为“About Python”,但它显示了IDLE About窗口。当从Wing IDE运行时(在X11下),idle不显示其“关于”窗口,并且出于某种原因idle不想调试idle.py

我已经能够将“About Python”替换为“About MyProgramName”,但我要么得到通常的“tk About”窗口,要么根本就没有关于窗口的信息。IDLE定义了一个虚拟事件来将控制权传递给它的About窗口,我一直在研究如何定义一个连接到菜单选项的虚拟事件

所以,我有
root.bind(“”,about_dialog)
,但是我如何连接它呢?tk.add_event()需要一个序列


有什么建议吗?

如果你说的是构建一个菜单栏,在菜单上有一个“帮助”条目,在“帮助”菜单上有一个“关于”条目,这是非常基本的东西,有很多很好的例子

其中任何一个都将清楚地解释如何为应用程序创建顶级菜单。如果你在谈论其他事情,请澄清

我在C:\Python27 dir下的源代码中搜索了
::tk::mac::ShowPreference
,并在文件C:\Python27\Lib\idlelib\macosxSupport.py中找到了代码,看起来它正在做你想做的事情(或者至少足够接近,你可以调整它)


我无法在createcommand()方法上找到任何好的文档,但我确认它存在于我从
root=Tk()创建的
root
小部件上。在寻找更多信息的同时,我也遇到了这个问题。

我正在寻找一个关于如何制作“关于”和“首选项”菜单项的完整示例,但没有找到,所以我自己制作了一个。这是在Mac OS 10.4.11和Mac OS 10.6.8上测试的

from Tkinter import *
from tkMessageBox import *

def do_about_dialog():
    tk_version = window.tk.call('info', 'patchlevel')
    showinfo(message= app_name + "\nThe answer to all your problems.\n\nTK version: " + tk_version)

def do_preferences():
    showinfo(message="Preferences window")

def do_button():
    print("You pushed my button")

def main():
    global app_name
    app_name = "Chocolate Rain"
    global window
    window = Tk()
    window.title("Main")

    # find out which version of Tk we are using
    tk_version = window.tk.call('info', 'patchlevel')
    tk_version = tk_version.replace('.', '')
    tk_version = tk_version[0:2]
    tk_version = int(tk_version)

    menubar = Menu(window)
    app_menu = Menu(menubar, name='apple')
    menubar.add_cascade(menu=app_menu)

    app_menu.add_command(label='About ' + app_name, command=do_about_dialog)
    app_menu.add_separator()

    if tk_version < 85:
       app_menu.add_command(label="Preferences...", command=do_preferences)
    else:
        # Tk 8.5 and up provides the Preferences menu item
        window.createcommand('tk::mac::ShowPreferences', do_preferences)

    window.config(menu=menubar) # sets the window to use this menubar

    my_button = Button(window, text="Push", command=do_button)
    my_button.grid(row=0, column=0, padx=50, pady=30)

    mainloop()

if __name__ == "__main__":
    main()
从Tkinter导入*
从tkMessageBox导入*
def do_关于对话框():
tk_version=window.tk.call('info','patchlevel'))
showinfo(message=app\u name+“\n您所有问题的答案。\n\nTK版本:“+tk\u版本)
def do_首选项():
showinfo(message=“首选项窗口”)
def do_按钮():
打印(“你按了我的按钮”)
def main():
全球应用程序名称
app_name=“巧克力雨”
全局窗口
window=Tk()
窗口标题(“主”)
#了解我们使用的是哪个版本的Tk
tk_version=window.tk.call('info','patchlevel'))
tk_版本=tk_版本。替换('.','')
tk_版本=tk_版本[0:2]
tk_版本=int(tk_版本)
菜单栏=菜单(窗口)
app_menu=菜单(菜单栏,name='apple')
菜单栏。添加级联(菜单=应用菜单)
应用程序菜单。添加应用程序命令(label='About'+app\u name,command=do\u About\u对话框)
应用程序菜单。添加分隔符()
如果tk_版本<85:
应用程序菜单。添加命令(label=“Preferences…”,command=do\u Preferences)
其他:
#Tk 8.5及以上提供首选项菜单项
createcommand('tk::mac::ShowPreferences',do_preferences)
window.config(menu=menubar)#设置使用此菜单栏的窗口
我的按钮=按钮(窗口,text=“Push”,command=do\u按钮)
my_button.grid(行=0,列=0,padx=50,pady=30)
mainloop()
如果名称=“\uuuuu main\uuuuuuuu”:
main()

在OSX中,有一个应用程序菜单,它位于Apple菜单的右侧,与当前应用程序同名。该菜单包含关于和首选项菜单等项。我已经找到了如何连接到首选项菜单,但没有找到关于。目前,我在“帮助”菜单中有一个“关于”菜单,但这与OSX应用程序的工作原理不一致。你读过我链接的Tkdocs页面吗?它有很多关于MacOSX和它的菜单的信息(我还没有研究过,因为我没有),是的,它已经在我的浏览器中打开了一个星期了。在“如何向应用程序菜单中添加关于appname项”下,有一个Python的待办事项。如果您重新阅读我的评论,您将看到我的首选项菜单已经开始工作了。macosxSupport.py是IDLE的一部分,我注意到我花了几个小时在其中爬行。那里有一个名为multicall.py的模块,它似乎是使用“call widget.bind(self、sequence、function、add)”建立连接的关键。诀窍似乎是如何获得对About小部件本身的引用。我不想导入idlelib的主要部分并创建其中使用的所有词典,以获得单个菜单项…有关如何在使用OS X 10.6以来提供的基于可可粉的Aqua Tk(8.5+)时管理“关于”菜单的更多信息,请参阅TkAqua FAQ()。这将处理程序函数绑定到关于菜单项:
root.createcommand('tkAboutDialog',yourAboutHandler)
但是我没有设法更改标题……你是怎么做到的?
from Tkinter import *
from tkMessageBox import *

def do_about_dialog():
    tk_version = window.tk.call('info', 'patchlevel')
    showinfo(message= app_name + "\nThe answer to all your problems.\n\nTK version: " + tk_version)

def do_preferences():
    showinfo(message="Preferences window")

def do_button():
    print("You pushed my button")

def main():
    global app_name
    app_name = "Chocolate Rain"
    global window
    window = Tk()
    window.title("Main")

    # find out which version of Tk we are using
    tk_version = window.tk.call('info', 'patchlevel')
    tk_version = tk_version.replace('.', '')
    tk_version = tk_version[0:2]
    tk_version = int(tk_version)

    menubar = Menu(window)
    app_menu = Menu(menubar, name='apple')
    menubar.add_cascade(menu=app_menu)

    app_menu.add_command(label='About ' + app_name, command=do_about_dialog)
    app_menu.add_separator()

    if tk_version < 85:
       app_menu.add_command(label="Preferences...", command=do_preferences)
    else:
        # Tk 8.5 and up provides the Preferences menu item
        window.createcommand('tk::mac::ShowPreferences', do_preferences)

    window.config(menu=menubar) # sets the window to use this menubar

    my_button = Button(window, text="Push", command=do_button)
    my_button.grid(row=0, column=0, padx=50, pady=30)

    mainloop()

if __name__ == "__main__":
    main()