当您在 Python 中使用 Tkinter 创建带有 GUI 的应用程序时,应用程序的名称在 OS X 上的菜单栏中显示为“Python”。如何才能让它显示为其他内容?
我的答案是基于埋藏在一些论坛中的一个答案。找到该解决方案有点困难,但我喜欢它,因为它允许您将应用程序作为单个跨平台脚本分发。无需通过 py2app 或类似的东西运行它,这将为您留下 OS X 特定的包。
无论如何,我在这里分享我的清理版本,以便比它到达那里时给予更多关注。您需要通过
pyobjc
安装 pip
才能获取代码中使用的 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>
在新版本的 macOS 中,已接受的答案显然不再适用。我找到了一个解决方法,可以删除名为“Python”的菜单项,因此您可以将其替换为具有应用程序名称的菜单。它至少可以在带有 Python 3.12 和 Tcl/Tk 8.6.14 的 macOS 14.4 上运行。我通过 tkdocs 中的一些信息以及一些尝试和错误找到了答案。 经过一些基本设置后,
from tkinter import *
APP_NAME = "Jim's app"
window = Tk()
window.title(APP_NAME)
menu = Menu()
您可以使用以下命令使Python
菜单消失,使用 name
构造函数中未记录的
Menu
参数 – 它们必须严格按照以下顺序:# Get rid of the "Python" menu
python_menu = Menu(menu, name='apple')
menu.add_cascade(menu=python_menu)
window['menu'] = menu
python_menu.destroy()
然后,您添加自己的菜单。例如,
# App-name menu
app_menu = Menu(menu)
menu.add_cascade(menu=app_menu, label=APP_NAME)
app_menu.add_command(label=f'About {APP_NAME}')
app_menu.add_separator()
app_menu.add_command(label=f'Settings...')
app_menu.add_separator()
app_menu.add_command(label=f'Quit {APP_NAME}', command=window.destroy)
# File menu
file_menu = Menu(menu)
menu.add_cascade(menu=file_menu, label=f'File')
file_menu.add_command(label=f'New...')
file_menu.add_command(label=f'Open...')
# Help menu
help_menu = Menu(menu)
menu.add_cascade(menu=help_menu, label='Help')
help_menu.add_command(label=f'{APP_NAME} Help')
(Help
菜单甚至有一个漂亮的搜索框,就像在其他应用程序中一样。)当然,您仍然需要编写处理菜单命令的函数,并将它们作为add_command
参数添加到
command
调用中。最后,要让应用程序运行,# GUI
Label(window, text=f'Just testing my new app {APP_NAME}').grid(padx=20, pady=20)
window.mainloop()
它并不漂亮(不幸的是第一个菜单上的应用程序名称不是粗体文本),但至少它有效。为了确保可移植性,您应该仅当程序在 macOS 上运行时才运行 Python 菜单销毁代码,
if sys.platform == 'darwin'
。
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()