python - PySide GUI 中的应用程序图标

标签 python qt qt4 pyside python-3.3

我有一个 PySide GUI 应用程序(用 Python 3 编写,在 Windows 7 Pro 上运行),我在其中设置应用程序图标如下:

class MyGui(QtGui.QWidget):
    def __init__(self):
        super(MyGui, self).__init__()
        ...
        self.setWindowIcon(QtGui.QIcon('MyGui.ico'))

        if os.name == 'nt':
            # This is needed to display the app icon on the taskbar on Windows 7
            import ctypes
            myappid = 'MyOrganization.MyGui.1.0.0' # arbitrary string
            ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
        ...

我从 this answer 得到了 ctypes 东西.如果我删除这些行,那么当我执行 python MyGui.py 时,Python 图标就会显示在任务栏中。

有了这些行,一切看起来都很棒,窗口和任务栏上的图标也正确。但是,当我使用 cxfreeze 打包 gui 时,窗口和任务栏图标都会更改为通用的 windows .exe 图标。

我正在使用 cxfreeze.bat 打包应用程序,使用找到的说明 here ,包括 --icon 开关。使用该开关使生成的 exe 在资源管理器中查看时具有正确的图标。但是,当我启动应用程序时,应用程序窗口和任务栏不显示图标。我试过将 .ico 文件复制到与 .exe 相同的目录,但这没有帮助。

我在 Windows 7 和 8 上都有相同的行为。奇怪的是,如果我将应用程序固定到任务栏,任务栏图标会正确显示,但窗口图标仍然是通用的 exe 图标。

如何让图标正确显示?

最佳答案

PySide 需要访问特殊的 DLL 才能读取 .ico 文件。我认为是 qico4.dll。

您可以尝试更改对 setWindowIcon 的调用以将图标作为 .png 打开并将其 .png 放入 ./dist 目录中,看看是否可行。如果是这样,那么您的代码没有问题,我很确定这是 .dll 问题。您需要告诉 cx_freeze 将 dll 包含在构建中。

我认为 PySide 向 Windows 提供了嵌入式 .ico,并且不需要能够读取数据本身,所以这就是它起作用的原因。但是,要读取嵌入式图标资源或可执行目录中的 ico 文件,它需要 DLL。

关于python - PySide GUI 中的应用程序图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17068003/

相关文章:

c++ - MIME 类型到文件扩展名的跨平台映射库,反之亦然

c++ - 关于 QMainWindow 构造函数中 UI Widgets 'new' 用法的困惑

python - 扩展 Jinja 的 {% trans %} 以使用 JavaScript 变量

python - 将 json 字典加载到数据框中

python - Matplotlib 饼图 'All Other Categories"

python - 使用 Cython 进行线分析内部函数

c++ - QT设计器背景图片问题

c++ - 无法使用 QtNetwork,因为应用程序使用不同的线程

qt - 添加 QGraphicsProxyWidget 时崩溃

Qt:QObject::connect:无法连接(空)