python-3.x 更改pystray托盘通知标题

juud5qan  于 2022-12-27  发布在  Python
关注(0)|答案(1)|浏览(267)

我在寻找更改**pystray**任务栏通知标题的方法时遇到了问题。它似乎从某个地方获取了默认值“Python”。请参见下图:

documentation中,没有额外的参数来改变通知图标的标题,我怎样才能找到一种方法来改变标题值为我想要的东西呢?
下面是一个工作代码示例:

from tkinter import *

from pystray import MenuItem as item
from PIL import Image, ImageTk

from res import * #here is my base64 encoded icon. Variable icon_base64.
from base64 import b64decode

import pystray
import base64

pic=ImageTk.BytesIO(icon_base64) #transfering base64 to bytes

def run_icon():
    #image = Image.open("icon.ico") #uncomment this to use a standard image, isntead of base64.
    title="Tray title"
    image=Image.open(pic) #comment this if using standard way of image
    menu = (item('test1', lambda: show(),default = True), item('Exit', lambda: exit()))
    global icon
    icon = pystray.Icon("name", image, title, menu)
    icon.run()
    
def show_notification(text):
    icon.notify(text,"My test notification sub title")
def show():
    print("show")
def show():
    print("exit")

run_icon()
sleep(3)
show_notification("test")

更新:我突然想到一个主意-也许这个“Python”是从项目名称或程序名称等中取出来的。我应该搜索或添加与命名参数相关的代码(在Win10操作系统上)吗?

7gyucuyw

7gyucuyw1#

    • Python**是一种解释型语言,这意味着它逐行执行代码,而不是将整个程序编译成一个独立的可执行文件。这意味着在编译之前,你的程序并不独立存在。在Windows环境中,你编写的命令由python.exe执行。

回答您的问题:在Windows中,每个通知的标题来自File description属性的值。在您的情况下,标题为"Python",如下所示:

鉴于此,您需要将代码转换为独立的可执行文件,并填充一些属性值。这可以通过两个步骤完成:

步骤1

创建VSVersionInfo文件(例如:version_info.rs),指示性内容如下:

VSVersionInfo(
    ffi=FixedFileInfo(
        OS=0x4,
        fileType=0x1,
    ),
    kids=[
        StringFileInfo(
            [
                StringTable(
                    u'040904B0',
                    [
                        StringStruct(u'FileDescription', u'Tray Application'),
                        StringStruct(u'InternalName', u'trayapplication'),
                        StringStruct(u'LegalCopyright', u'Copyright (c) Andreas Violaris'),
                        StringStruct(u'OriginalFilename', u'trayapplication.exe'),
                        StringStruct(u'ProductName', u'trayapplication'),
                        StringStruct(u'ProductVersion', u'1.0')])
                    ]
        ),
        VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
    ]
)
TL; DR:
    • VSVersionInfo结构用于存储Windows可执行文件的版本信息。该结构由两部分组成。"ffi"部分是FixedFileInfo**结构,它存储有关文件的常规信息,如文件类型、操作系统版本和其他属性。"kids"部分是存储更具体版本信息的子结构列表。
VSVersionInfo结构的"ffi"部分包含FixedFileInfo结构。
  • "OS"属性指定设计文件的操作系统版本。值0x4对应于Windows NT操作系统。
  • "fileType"属性指定文件的类型。值0x1对应于一个应用程序。
VSVersionInfo结构的"kids"部分包含具有两个元素的列表:一个字符串文件信息结构和一个可变文件信息结构。
      • StringFileInfo结构包含一个自解释的StringStruct**结构列表。
      • VarFileInfo结构用于存储有关文件的语言和字符集的信息。它由单个VarStruct**结构组成,该结构具有属性"Translation"和值[1033, 1200],该值对应于英语(美国)语言和Unicode字符集。

步骤2

使用类似**PyInstaller的工具将程序转换为独立的可执行文件。要使用PyInstaller**,首先需要使用类似pip的软件包安装程序安装它:

pip install pyinstaller

然后,您可以使用以下PyInstaller命令将程序打包为可执行文件,并使用第一步中的version_info.rs文件设置其版本信息:

pyinstaller --onefile main.py --version-file version_info.rs

结果

运行可执行文件(位于dist目录中)后,您会发现通知标题现在具有您在第一步中分配给FileDescription属性的值。

相关问题