wxPython任务栏图标

5

我尝试在我的wxpython程序中设置一个图标。到目前为止,在阅读了许多页面和示例后,我能够在窗口上设置一个图标,并且在使用alt + tab时也有效(我正在Windows 7上工作)。

但任务栏上的图标是通常的Python默认图标。

我不明白为什么这么简单的任务会有这么多麻烦。

以下是我的代码:

class GraphFrame(wx.Frame):
    """ The main frame of the application
    """
    title = 'My first wxprogram'

    def __init__(self):
        wx.Frame.__init__(self, None, -1, self.title)

        ico = wx.Icon('dog.ico', wx.BITMAP_TYPE_ICO)
        self.SetIcon(ico)
        self.set_icon  

        self.create_menu()
        self.create_status_bar()
        self.create_main_panel()
        #...
4个回答

11

我已经找到了解决我在另一个与PyQt相关的SO问题/答案中描述的问题的方法。在GUI创建之前,在您的应用程序中添加此代码:

import ctypes
myappid = 'mycompany.myproduct.subproduct.version' # arbitrary string
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)

使用任务栏按钮设置可以正确地设置图标。

可以在这里找到解释:https://dev59.com/w3I_5IYBdhLWcg3wDOdC#1552105


3

在特定情况下,TyrantWave和我的答案都是正确的。这取决于Windows 7的设置:

任务栏按钮设置

当标签被隐藏时,图标似乎没有被设置:

输入图像描述

当标签显示时,它按预期正常工作:

输入图像描述


3
目前无法通过wxPython设置任务栏图标(除非您破解系统变量),这是因为Windows从可执行文件中获取应用程序图标(在您的情况下是Python)。如果使用pyinstallerpy2exe(我更喜欢前者),编译时可以设置应用程序图标,这将使任务栏图标正确。如果使用pyinstaller,则需要在specfile中设置图标,如下所示:
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.datas,
          name=os.path.join('..\\path\\to\\output', 'AppName.exe'),
          icon='C:\\abs\\path\\to\\icon\\icon.ico',
          debug=False,
          strip=False,
          upx=False,
          console=False )
icon=...这一行设置任务栏图标。
你的其他Python代码没有问题。

2
通常情况下,可以在wxPython中设置任务栏图标,因此-1不应该出现。 - Fenikso
1
关于Win7的问题,我没有进行任何测试,也没有在wxPython邮件列表中提到过。 - TyrantWave

3

它应该按预期工作。我猜你的问题只是图标格式。通常我会使用随wxPython包含的img2py.py脚本将图标嵌入代码中。这里是一个可行的示例:

enter image description here

import wx
from wx.lib.embeddedimage import PyEmbeddedImage

plane = PyEmbeddedImage(
    "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")

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        self.SetIcon(plane.GetIcon())
        self.panel = wx.Panel(self)
        self.Show()

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

Python和Windows的哪个版本?运行您的代码时,图标未设置 - 使用Python应用程序图标。(Windows x64,python 2.7.3)。还在x86计算机上进行了检查,相同的行为 - 图标未设置。(相同的python和wx) - TyrantWave
@TyrantWave - 很有趣!我从来没有遇到过这样的问题。现在我开始变得好奇了。也许是wxPython中的一个bug?任务栏或窗口效果设置?操作系统:Windows 7 32位,Python:2.7.3,wxPython:2.8.12.1。 - Fenikso
你是否使用Aero?也许非Aero可以覆盖图标,但启用它后,Windows只从可执行文件中获取图标。我正在运行相同的Python/wx,并且在x86/x64 Windows上都有运行。 - TyrantWave
1
啊哈!我找到了!“任务栏和开始菜单属性/任务栏/任务栏按钮/始终合并和隐藏标签”。显示标签时它可以工作。 - Fenikso
啊,那确实有效。我总是隐藏标签(因为图标比任何文本更能解释它)。 - TyrantWave
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接