【问题标题】:How to replace the "About Tkinter" menu in Python on OSX如何在 OSX 上替换 Python 中的“关于 Tkinter”菜单
【发布时间】:2012-05-13 13:15:31
【问题描述】:

编辑:我指的是 OSX 应用程序菜单,其中包含 About 和 Preference 菜单项(以及其他)。

对于知道正确搜索词的人来说,这可能是另一个简单的问题,但是在 IDLE 中花费数小时跟踪代码并搜索网络之后,我还没有完全能够将这些点联系起来。

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

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

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

有什么建议吗?

【问题讨论】:

  • 这将处理函数绑定到关于菜单项:root.createcommand('tkAboutDialog', yourAboutHandler) 但是我没有设法更改标题...你是怎么做到的?

标签: python menu tkinter


【解决方案1】:

我一直在寻找有关如何制作 About 和 Preferences 菜单项的完整示例,但没有找到,所以我自己制作了。这是在 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()

【讨论】:

    【解决方案2】:

    如果您要构建一个菜单栏,菜单上有一个帮助条目,并在帮助菜单上有一个关于条目,那是非常基本的东西,周围有很好的例子。

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

    我在我的 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 = Tk() 创建的 root 小部件上。在寻找更多信息时,我还遇到了这个主题的 little discussion

    【讨论】:

    • 在 OSX 中,有一个应用程序菜单,它位于 Apple 菜单的右侧,名称与当前应用程序相同。除其他项目外,该菜单还包含关于和首选项菜单。我已经弄清楚如何连接到“首选项”菜单,但不知道“关于”。目前我在帮助菜单中有一个关于菜单,但这与 OSX 应用程序的工作方式不一致。
    • 你读过我链接的 Tkdocs 页面吗?它有很多关于 Mac OS X 及其菜单的信息(我没有探索过,因为我没有)。
    • 是的,它已经在我的浏览器中打开了一周。在 How to add About appname entry to the application menu 下,它有一个 Python 的待办事项。
    • 如果您重新阅读我的评论,您会发现我的首选项菜单已经在工作。 macosxSupport.py 是 IDLE 的一部分,我注意到我已经花了几个小时爬过它。那里有一个名为 MutiCall.py 的模块,它似乎是使用“call widget.bind(self, sequence, function, add)”建立连接的关键。诀窍似乎是如何获得对“关于”小部件本身的引用。我不想导入 idlelib 的主要部分并创建那里使用的所有字典以获得单个菜单条目...
    • 请参阅 TkAqua 常见问题解答 (wiki.tcl.tk/12987#pagetoc04a759fa),了解有关在使用自 OS X 10.6 起发布的基于 Cocoa 的 Aqua Tk (8.5+) 时如何管理“关于”菜单的更多信息。
    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2014-08-04
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多