55

如何在 PyQt4 中设置应用程序的任务栏图标?

我试过setWindowIcon,它成功地设置了主窗口左上角的图标,但它不影响Windows 7任务栏中显示的图标——任务栏图标仍然是默认的Python pyw图标。这是我的代码:

from PyQt4 import QtGui

app = QtGui.QApplication([])
mainwindow = QtGui.QMainWindow()
mainwindow.show()

app.setWindowIcon(QtGui.QIcon('chalk.ico'))
mainwindow.setWindowIcon(QtGui.QIcon('chalk.ico'))
app.exec_()

[更新] 我试过setWindowIcon()show(). 我已经尝试过使用其他图像、ico 和 png。没有什么帮助。

4

3 回答 3

129

经过一番挖掘,我找到了答案。

在 Windows 7 中,任务栏本身不是用于“应用程序窗口”,而是用于“应用程序用户模型”。例如,如果您有几个不同的应用程序实例正在运行,并且每个实例都有自己的图标,那么它们都将被分组在一个任务栏图标下。Windows 使用各种启发式方法来决定是否应该对不同的实例进行分组,在这种情况下,它决定由 Pythonw.exe 托管的所有内容都应该分组在 Pythonw.exe 的图标下。

正确的解决方案是 Pythonw.exe 告诉 Windows 它只是托管其他应用程序。也许未来的 Python 版本会做到这一点。或者,您可以添加一个注册表项来告诉 Windows Pythonw.exe 只是一个主机,而不是一个应用程序。请参阅AppUserModelIDs的 MSDN 文档。

或者,您可以使用来自 Python 的 Windows 调用来明确地告诉 Windows 此过程的正确 AppUserModelID 是什么:

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

编辑:请参阅 Ronan 的回答:myappid 字符串应该是 unicode。

于 2009-10-11T23:43:59.353 回答
13
于 2015-01-10T03:36:09.470 回答
5

您必须在应用显示任何 GUI 之前设置 AppUserModelID。如果您需要访问其他 Windows 7 功能,您可以查看Q7Goodies,它是带有 PyQt 绑定的 Windows 7 的 Qt 插件。

于 2010-09-08T18:24:03.263 回答