在 OS X 菜单栏中更改 Tkinter 应用程序的标题

Posted

技术标签:

【中文标题】在 OS X 菜单栏中更改 Tkinter 应用程序的标题【英文标题】:Change title of Tkinter application in OS X Menu Bar 【发布时间】:2015-07-12 15:29:04 【问题描述】:

当您在 Python 中使用 Tkinter 创建具有 GUI 的应用程序时,您的应用程序名称在 OS X 的菜单栏中显示为“Python”。您如何让它显示为其他名称?

【问题讨论】:

相关***.com/questions/8695926/… 叹息。您会认为 tkinter 在您设置标题时会自动执行此操作。 @EdwardFalk - 在 Mac 上,Windows 和应用程序通常不像在 Windows 和大多数 Linux GUI 上那样同义。所以......不,我不希望这种行为。不过,我希望有一些简单的方法可以达到预期的结果。我很好奇为什么我在我的时区凌晨 3:30 发布了这个问答 - 6 年前的这个晚上我在做什么?距离我的婚礼只有 3 周。 相关XKCD:xkcd.com/979 【参考方案1】:

我的回答是基于埋在some forums 中间的一个。找到该解决方案有点困难,但我喜欢它,因为它允许您将应用程序作为单个跨平台脚本分发。无需通过 py2app 或类似的方式运行它,这将为您留下 OS X 特定的包。

无论如何,我在这里分享我的清理版本,以便在它到达那里时给予它更多的关注。您需要通过pip 安装pyobjc 以获取代码中使用的Foundation 模块。

from sys import platform

# Check if we're on OS X, first.
if platform == 'darwin':
    from Foundation import NSBundle
    bundle = NSBundle.mainBundle()
    if bundle:
        info = bundle.localizedInfoDictionary() or bundle.infoDictionary()
        if info and info['CFBundleName'] == 'Python':
            info['CFBundleName'] = <Your application name here>

【讨论】:

但这需要另一个第三方库。有没有办法在 Tk 中做到这一点? @Zizouz212:我有一个脚本可以自动安装pip 并在运行时使用它来安装其他框架。当用户第一次运行您的应用程序时(假设他们有互联网连接),这对用户来说是一次性的。所以我认为第三方库的成本非常低。但是,如果您想不使用它,我想您可以查看NSBundle 的源代码,然后从中获取您需要的内容并将其直接插入到您自己的代码中。 尝试在最新的 MBP15 上安装 pyobjc - 大约花了半个小时。不是一个选项。 嗯,这主要是我的错。显然,PyObjC 预装了 OSX。以前我认为我自己安装了它,缺少专用的 virtualenv,因此将其卸载。再次安装它需要很多时间,主要是因为只使用了 1 个核心,请参阅 ***.com/questions/26228136/… @Andrei - 你真正需要的是pyobjc 提供的FoundationobjcCoreFoundation 模块。我已经验证我能够将一个 Python 安装上的 site-packages 中的这 3 个文件夹复制到另一个,并且它可以正常工作。如果这对您的要求还不够简单,那么我相信这 3 个模块是开源的,您可能可以将它们中的相关代码剪切并粘贴到一个精简的源文件中,仅针对这个单一任务。【参考方案2】:

可能不是您所需要的,但我很惊讶没有人提到简单的、独立于平台的方式(在 Win 7 上与 Python 3.x 一起使用):

from tkinter import Tk

root = Tk()
root.title( "Your title here" )  # or root.wm_title

如果你想改变图标:

''' Replace the default "Tk" icon with an Application-specific icon '''
''' (that is located in the same folder as the python source code). '''

import sys
from tkinter import PhotoImage 

program_directory = sys.path[ 0 ]

IconFile = os.path.join( program_directory ) + "\ApplicationIcon.gif" 
IconImage = PhotoImage( file = IconFile ) 

root.tk.call( 'wm', 'iconphoto', root._w, IconImage )

root.mainloop()

【讨论】:

我专门询问了有关 OS X 的问题(并希望得到一个适用于 2.7 的答案,尽管这可能没有什么不同。)您是否真的在 OS X 上尝试过并看到它有效?我必须假设我在一年前询问之前尝试过这个......我实际上并没有一台运行 OS X 的计算机在我面前进行测试。当我有机会在 Mac 上进行测试时,我会研究这个... 在 OSX 上使用 Pyton 2.x from Tkinter import * root = Tk() root.title( "Your title here" ) w = Label(root, text="Hello, world! ") w.pack() root.mainloop() 由于愚蠢的 5 分钟编辑 cmets 限制而重新发布。对于 python 2.x 使用“来自 Tkinter”而不是“来自 tkinter”(对于 3.x)。 Tkinter/tkinter 被设计为至少在 Linux、Win 和 Mac 上是跨平台兼容的。使用 Python 2.x 在 OS X 上尝试此代码 - 它从 link 稍作修改: root = Tk() root.title( "Your title here" ) w = Label(root, text="Hello, world!") w.pack() root.mainloop() 问题是关于如何在 MacOS 上运行时摆脱菜单左上角的“Python”程序名称。您在不同的平台 (Windows) 上回答了一个完全不同的问题(将标题设置在应用框架的中间)。 (迟到总比没有好)只是提醒一下 tkinter 是独立于平台的。无论平台如何,该解决方案都应该适用于任何相当现代的 python 版本(尽管它可能需要针对 2.x 进行一些调整:例如,将“from tkinter import Tk”更改为“from Tkinter import Tk”)

以上是关于在 OS X 菜单栏中更改 Tkinter 应用程序的标题的主要内容,如果未能解决你的问题,请参考以下文章

Python Tkinter:在状态栏中显示描述

如何在 Mac OS X 上更改 Tkinter 按钮的前景色或背景色?

如何在 OS X 上的 PyQt4 中更改应用程序菜单名称

Qt:在 Mac OS X 上更改应用程序 QMenuBar 内容

如何使用 python 3 和 tkinter 模块从右到左对齐菜单栏中的项目?

OS X 菜单栏附加功能 + Apple HIG + UX 模式冲突 - 退出时不退出