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

时间:2012-05-04 00:46:02

标签: python menu tkinter

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

对于那些知道正确搜索条件的人来说,这可能是另一个简单的问题,但是花了几个小时跟踪IDLE中的代码并搜索网络后,我还是无法连接点。

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

我已经能够用“关于MyProgramName”取代“关于Python”,但我要么得到通常的“tk关于”窗口,要么根本没有关于窗口。 IDLE定义了一个虚拟事件来将控制传递给它的About窗口,而我仍然坚持如何定义连接到菜单选择的虚拟事件。

所以,我有root.bind('<<about-myprogram>>', about_dialog),但我如何连接它? tk.add_event()需要一个序列...

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果您正在讨论在菜单上使用帮助条目构建一个菜单栏并在帮助菜单上有一个关于条目,这是非常基本的东西,并且有很好的例子。

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

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

def config_dialog(event=None):
    from idlelib import configDialog
    root.instance_dict = flist.inversedict
    configDialog.ConfigDialog(root, 'Settings')

root.createcommand('::tk::mac::ShowPreferences', config_dialog)

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

答案 1 :(得分:1)

我正在寻找一个关于如何制作“关于”和“首选项”菜单项的完整示例,但没有找到任何,所以我自己制作了。这是在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()