如何在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识别为“另一个进程”并相应地切换图标。