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

如何在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()之前放置setWindowIcon() show() 。 我用其他图像,ico和PNG尝试过。 没什么帮助。

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

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

正确的解决scheme是Pythonw.exe告诉Windows,它只是托pipe其他应用程序。 也许未来的Python版本将做到这一点。 或者,你可以添加一个registry键告诉Windows Pythonw.exe只是一个主机而不是一个应用程序本身。 请参阅AppUserModelID的 MSDN文档。

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

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

编辑:请参阅Ronan的答案:myappidstring应该是unicode。

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

@ DamonJW的答案将工作,但有一个小错误:myappid应该是unicode(参数types是PCWSTR)。

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

否则,获取AppUserModelID将得到错误的Unicode字符( 祭潣灭湡⹹祭牰摯捵⹴畳灢潲畤瑣瘮牥楳湯 )。

 import ctypes from ctypes import wintypes lpBuffer = wintypes.LPWSTR() AppUserModelID = ctypes.windll.shell32.GetCurrentProcessExplicitAppUserModelID AppUserModelID(ctypes.cast(ctypes.byref(lpBuffer), wintypes.LPWSTR)) appid = lpBuffer.value ctypes.windll.kernel32.LocalFree(lpBuffer) if appid is not None: print(appid) 

也就是说,这是一件小事,因为Windows仍然会将Unicodestring识别为“另一个进程”并相应地切换图标。