web-dev-qa-db-fra.com

Comment définir l'icône de la barre des tâches de l'application dans Windows 7

Comment définir l'icône de la barre des tâches d'une application dans PYQT4?

J'ai essayé Setwindowicon et définit avec succès l'icône en haut à gauche de la fenêtre principale, mais elle n'affecte pas l'icône affichée dans la barre des tâches Windows 7 - l'icône de la barre des tâches reste la valeur par défaut Python pyw icône. Voici mon code:

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

[Mise à jour] J'ai essayé de placer la setWindowIcon() avant la show(). Je l'ai essayé avec d'autres images, ICO et PNG. Rien n'aide.

41
DamonJW

J'ai trouvé la réponse, après avoir creusé.

Dans Windows 7, la barre des tâches n'est pas destinée à "Windows d'application" en soi, il est destiné aux "modèles d'utilisateurs d'applications". Par exemple, si vous avez plusieurs instances différentes de votre application en cours d'exécution et que chaque instance a sa propre icône, ils seront tous regroupés dans une seule icône de la barre des tâches. Windows utilise diverses heuristiques pour décider si des cas différents doivent être regroupés ou non, et, dans ce cas, il a décidé que tout hébergé par Pythonw.exe devrait être regroupé sous l'icône de Pythonw.exe.

La solution correcte est pour Pythonw.exe de dire Windows qu'il accueille simplement d'autres applications. Peut-être une version future de Python le fera également cela. Vous pouvez également ajouter une clé de registre pour indiquer Windows que Pythonw.exe est juste un hôte plutôt qu'une application à part entière. Voir la documentation MSDN. Voir la documentation MSDN pour appusmermodelids .

Vous pouvez également utiliser un appel Windows à partir de Python, pour informer explicitement Windows ce que l'appusermodélide correct est pour ce processus:

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

Edit: Veuillez voir la réponse de Ronan: la chaîne myappid devrait être unicode.

95
DamonJW

@ La réponse de Damonjw fonctionnera, mais il y a une prise mineure: Myappid devrait être Unicode (le type d'argument est PCWSTR).

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

Sinon, obtenir l'appusmodelid aura mal des caractères 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)

Cela dit, c'est une chose mineure, car Windows reconnaîtra toujours la chaîne Unicode comme "un autre processus" et commutez l'icône en conséquence.

8
Ronan Paixão

Vous devez définir l'appusermodélide avant que votre application ne montre une interface graphique. Si vous devez accéder à d'autres fonctionnalités Windows 7, vous pouvez consulter - Q7Goodies qui est un complément QT pour Windows 7 avec une liaison PYQT.

4
torn