首页 > 解决方案 > 如何在 tkinter 应用程序中打包和使用图标?

问题描述

我尝试在tkinter. 安装后我无法显示应用程序图标。我应该改变什么才能使它成为可能?这是我的包目录树:

gui_app/
 | gui_app/
    | __init__.py
    | __main__.py
 | img/
    | icon.gif
 | setup.py

setup.py包含:

from setuptools import setup
from gui_app import __version__

setup(
    name='gui_app',
    version=__version__,
    packages=['gui_app'],
    data_files=[('', ['img/icon.gif'])],
    entry_points={'gui_scripts': ['gui_app = gui_app.__main__:main'],},
)

为了加载我的图标,我尝试了这里描述的不同方法:pkgutilimportlib.resources。不幸的是,他们都没有为我工作。我可能做错了什么。这是我最终得到的代码:

import tkinter as tk
from importlib.abc import ResourceReader as res

def get_path_before_install():
    return 'img/icon.gif'

def get_path_after_install():
    return res.resource_path('.', 'icon.gif')

def display_gui():
    root = tk.Tk()
    icon_path = get_path_after_install()
    icon = tk.PhotoImage(file=str(icon_path))
    root.iconphoto(False, icon)
    root.mainloop()

def main():
    display_gui()

if __name__ == '__main__': main()

当我使用$ pip install .然后$ gui_app它产生FileNotFoundError. 安装后如何更正它以显示图标?

标签: pythontkintersetuptools

解决方案


首先:package_data是位于 Python 包中的数据。因此,请确保包含该文件的目录是一个实际的 Python 包(您可能希望在__init__.py其中添加一个文件),并确保该包已正确添加到您的发行版(sdistbdist)。

因此,对于您的情况,以下建议可能会有所帮助:

  • 将图像移动到gui_app/img/icon.gif
  • 添加gui_app/img/__init__.py(您可能会看到建议说没有必要,如果您真正理解该建议及其含义,请随时遵循它)
  • 添加gui_app.img到用作函数调用中参数的packages参数的列表setuptools.setup
  • 相应地调整代码

推荐阅读