在 tkinter 脚本上使用 pyinstaller 制作的可执行文件中嵌入 Windows 操作系统任务栏的图标

问题描述 投票:0回答:1

我使用的是 Windows 11 家庭操作系统、Python 3.11.9 和 pyinstaller 6.11.1。

这是我的基本 tkinter 脚本(让我们称之为 my-script.py):

import tkinter as tk
class Application(tk.Tk):
    def __init__(self, title:str="Simple", x:int=0, y:int=0, **kwargs):
        tk.Tk.__init__(self)
        self.title(title)
        self.config(**kwargs)
        self.iconbitmap('icon.ico')
        self.first_row_frame=tk.Frame(self)
        self.first_row_frame.grid(column=0,row=0,sticky='W')
        self.lbl_ser_num=tk.Label(self.first_row_frame,text="Sr No:",font='Arial 50 bold')
        self.lbl_ser_num.grid(column=0,row=0)
        self.update_idletasks()
        self.state('zoomed')

if __name__ == "__main__":
    # height of 0 defaults to screenheight, else use height
    Application(title="simple app").mainloop()

如您所见,我使用

icon.ico
作为图标(我无法在本文中上传该文件,您可以从 https://raw.githubusercontent.com/shanet/Cryptully/refs/heads/master/ 获取一个) src/images/icon.ico).

我使用此命令创建了一个可执行文件:

pyinstaller --onefile -i "icon.ico" my-script.py 

这将创建一个包含

my-script.exe
的 dist 文件夹。

如果我运行

my-script.exe
,那么我会收到以下错误:

回溯(最近一次调用最后一次):

文件“full-path-to-my-script.py”,第 17 行,位于
Application(title="简单的应用程序").mainloop()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

文件“full-path-to-my-script.py”,第 7 行,在 init
self.iconbitmap('icon.ico')

文件“tkinter_init_.py”,第 2155 行,在 wm_iconbitmap
_tkinter.TclError:位图“icon.ico”未定义

[PYI-2628:ERROR] 由于未处理的异常,无法执行脚本“my-script”!

如果我将

icon.ico
复制到此
dist
文件夹,则可执行文件将按预期工作(图标出现在窗口标题栏和任务栏中)。

我的目标是有一个

.exe
文件来运行脚本。我在这里做错了什么?

如果需要任何其他详细信息,请告诉我。

谢谢

PS:我注意到 Windows 资源管理器文件管理器中出现了图标,这没关系,但当我运行

.exe
文件时,我的目标是任务栏中的大图标。

windows tkinter pyinstaller
1个回答
0
投票

@acw1668 告诉阅读 https://pyinstaller.org/en/stable/runtime-information.html

使用它,我将

tkinter
代码更改为以下

import tkinter as tk
import sys
from os import path
class Application(tk.Tk):
    def __init__(self, title:str="Simple", x:int=0, y:int=0, **kwargs):
        tk.Tk.__init__(self)
        self.title(title)
        self.config(**kwargs)
        #
        if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
            print('running in a PyInstaller bundle')
        else:
            print('running in a normal Python process')
        self.first_row_frame=tk.Frame(self)
        path_to_dat = path.abspath(path.join(path.dirname(__file__),'icofolder'))
        print(path_to_dat)
        self.iconbitmap(path_to_dat+'\\icon.ico')
        self.first_row_frame.grid(column=0,row=0,sticky='W')
        self.lbl_ser_num=tk.Label(self.first_row_frame,text="Sr No:",font='Arial 50 bold')
        self.lbl_ser_num.grid(column=0,row=0)
        self.update_idletasks()
        self.state('zoomed')

if __name__ == "__main__":
    # height of 0 defaults to screenheight, else use height
    Application(title="simple app").mainloop()

然后我使用以下命令创建了exe

pyinstaller --clean --onefile -i "icon.ico" --add-data "icon.ico;icofolder" my-script.py

然后你只需从任何地方运行 dist 文件夹的 exe 文件即可。

现在唯一的问题是图标是模糊的,尽管我的图标根据 mspaint 是 184x256 像素。

© www.soinside.com 2019 - 2024. All rights reserved.