Jak ustawić ikonę paska zadań aplikacji w systemie Windows 7

Jak ustawić ikonę paska zadań aplikacji w PyQt4?

Próbowałem setWindowIcon i pomyślnie ustawia ikonę w lewym górnym rogu głównego okna, ale nie wpływa na ikonę pokazaną na pasku zadań Windows 7 - ikona paska zadań pozostaje domyślną ikoną Pythona pyw. Oto Mój kod:

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_()

[update] próbowałem umieścić setWindowIcon() Przed show(). Próbowałem go z innymi obrazami, ico i png. Nic nie pomaga.

Author: Brown, 2009-10-11

3 answers

Znalazłem odpowiedź, po pewnym kopaniu.

W systemie Windows 7 pasek zadań nie jest przeznaczony dla "Windows aplikacji" per se, jest przeznaczony dla "modeli użytkowników aplikacji". Na przykład, jeśli uruchomionych jest kilka różnych instancji aplikacji, a każda z nich ma własną ikonę, wszystkie zostaną pogrupowane pod jedną ikoną paska zadań. Windows wykorzystuje różne heurystyki, aby zdecydować, czy różne instancje powinny być pogrupowane, czy nie. w tym przypadku zdecydował, że wszystko hostowane przez Pytonw.exe powinny być pogrupowane pod ikoną dla Pythonw.exe.

Poprawne rozwiązanie jest dla Pythonw.exe powiedzieć Windows, że jest tylko hosting innych aplikacji. Być może przyszłe wydanie Pythona to zrobi. Alternatywnie możesz dodać klucz rejestru, aby poinformować System Windows, że Pythonw.exe jest tylko hostem, a nie aplikacją samą w sobie. Zobacz dokumentację MSDN dla AppUserModelIDs .

Alternatywnie, możesz użyć wywołania Windows z Pythona, aby jawnie powiedzieć Windows jaki jest prawidłowy AppUserModelID dla tego procesu:

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

EDIT: zobacz odpowiedź Ronana: łańcuch myappid powinien być unicode.

 113
Author: DamonJW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-11 04:34:30

@DamonJW odpowiedź będzie działać, ale jest drobny haczyk: myappid powinien być unicode (typ argumentu to PCWSTR).

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

W Przeciwnym Razie uzyskanie AppUserModelID spowoduje błędne znaki 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)

To powiedziawszy, jest to drobna rzecz, ponieważ Windows nadal rozpoznaje ciąg unicode jako "inny proces" i odpowiednio przełącza ikonę.

 11
Author: Ronan Paixão,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-10 03:36:09

Musisz ustawić AppUserModelID, zanim aplikacja wyświetli jakikolwiek GUI. Jeśli chcesz uzyskać dostęp do innych funkcji systemu Windows 7, możesz spojrzeć na Q7Goodies, który jest dodatkiem Qt dla systemu Windows 7 z powiązaniami PyQt.

 5
Author: torn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-08 18:24:03