Подтвердить что ты не робот

Как установить значок панели задач приложения в Windows 7

Как установить значок панели задач приложения в PyQt4?

Я попробовал setWindowIcon, и он успешно устанавливает значок в левом верхнем углу главного окна, но не влияет на значок, показанный на панели задач Windows 7. Значок панели задач остается значком питона Python по умолчанию. Вот мой код:

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. Ничего не помогает.

4b9b3361

Ответ 1

Я нашел ответ после некоторого рытья.

В Windows 7 панель задач предназначена не для "прикладной Windows", а для "моделей пользовательских пользователей". Например, если у вас несколько разных экземпляров вашего приложения, и каждый экземпляр имеет свой собственный значок, то все они будут сгруппированы под одним значком панели задач. Windows использует различные эвристики, чтобы решить, нужно ли группировать разные экземпляры или нет, и в этом случае он решил, что все, размещенное Pythonw.exe, должно быть сгруппировано под иконкой для Pythonw.exe.

Правильное решение для Pythonw.exe - сообщить Windows, что он просто размещает другие приложения. Возможно, будущий выпуск Python сделает это. Кроме того, вы можете добавить раздел реестра, чтобы сообщить Windows, что Pythonw.exe - это просто хост, а не приложение в своем собственном праве. См. Документацию MSDN для AppUserModelIDs.

В качестве альтернативы вы можете использовать вызов Windows из Python, чтобы явно указать Windows, какой правильный AppUserModelID для этого процесса:

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

EDIT: см. ответ Ronan: строка myappid должна быть unicode.

Ответ 2

Вы должны установить AppUserModelID перед тем, как ваше приложение покажет любой графический интерфейс. Если вам нужно получить доступ к другим функциям Windows 7, вы можете посмотреть Q7Goodies, который является дополнением Qt для Windows 7 с Связи PyQt.

Ответ 3

@DamonJW ответ будет работать, но есть небольшой улов: myappid должен быть unicode (тип аргумента - 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 все равно распознает строку unicode как "другой процесс" и соответствующим образом переключит значок.