2009-10-11 12 views
35

Come si imposta l'icona della barra delle applicazioni di un'applicazione in PyQt4?Come impostare l'icona della barra delle applicazioni dell'applicazione in Windows 7

Ho provato setWindowIcon e ha impostato correttamente l'icona nell'angolo in alto a sinistra della finestra principale, ma non influisce sull'icona visualizzata nella barra delle applicazioni di Windows 7: l'icona della barra delle applicazioni rimane l'icona Python predefinita di Python. Qui è il mio codice:

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] Ho provato mettendo il setWindowIcon() prima della show(). L'ho provato con altre immagini, ico e png. Niente aiuta

+0

Imposta l'icona prima di '.show()' la finestra di aiuto? –

+0

No, non fa alcuna differenza se imposto l'icona prima di '.show()'. – DamonJW

+0

Hai provato un altro file immagine? Il tuo codice funziona bene per me con un file png casuale, anche se sto usando KDE4. –

risposta

79

Ho trovato la risposta, dopo alcuni scavi.

In Windows 7, la barra delle applicazioni non è per "Applicazione Windows" in sé, è per "Modelli utente applicazione". Ad esempio, se ci sono diverse istanze dell'applicazione in esecuzione e ciascuna istanza ha la propria icona, tutte verranno raggruppate sotto un'unica icona della barra delle applicazioni. Windows utilizza varie euristiche per decidere se raggruppare o meno istanze diverse e in questo caso ha deciso che tutto ciò che è ospitato da Pythonw.exe deve essere raggruppato sotto l'icona di Pythonw.exe.

La soluzione corretta è per Pythonw.exe per indicare a Windows che si tratta semplicemente di ospitare altre applicazioni. Forse una versione futura di Python lo farà. In alternativa, è possibile aggiungere una chiave di registro per indicare a Windows che Pythonw.exe è solo un host anziché un'applicazione a sé stante. Vedere la documentazione MSDN per AppUserModelIDs.

In alternativa, è possibile utilizzare una chiamata Windows da Python, a dire esplicitamente di Windows quello che il corretto AppUserModelID è per questo processo:

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

EDIT: Si prega di consultare la risposta di Ronan: la stringa myappid dovrebbe essere unicode.

+0

Dovresti accettare la tua risposta se risolve il tuo problema. :) – Macke

+0

Grazie! Avevo bisogno della stessa cosa usando PySide. – BaldDude

+0

Come scoprire cosa è myappid? – aBiologist

4

È necessario impostare AppUserModelID prima che l'app mostri una GUI. Se hai bisogno di accedere ad altre funzionalità di Windows 7 puoi dare un'occhiata a Q7Goodies che è un componente aggiuntivo Qt per Windows 7 con un binding PyQt.

4

@ La risposta di DamonJW funzionerà, ma c'è un problema minore: myappid dovrebbe essere unicode (tipo di argomento è PCWSTR).

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

In caso contrario, ricevendo l'AppUserModelID otterrà caratteri unicode sbagliate (祭潣灭湡⹹祭牰摯捵⹴畳灢潲畤瑣瘮牥楳湯):

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) 

Detto questo, è una cosa minore, a partire da Windows sarà ancora riconoscere la stringa Unicode come "un altro processo" e cambia l'icona di conseguenza.

+0

Non riuscivo a far funzionare il tuo codice, ma la risposta di @DamonJW funzionava per me. – uruloke

+0

La prima parte del mio codice è la stessa di @ DamonJW, ad eccezione di 'u' nella stringa' myappid'. La seconda parte è solo il controllo della stringa effettiva che Windows sta "vedendo". –

+0

Bella aggiunta. Presumibilmente questo è un non-problema su Python 3 poiché tutte le stringhe sono unicode. – Snorfalorpagus

Problemi correlati