2009-10-11 58 views
35

¿Cómo configuro el icono de la barra de tareas de una aplicación en PyQt4?Cómo establecer el icono de la barra de tareas de la aplicación en Windows 7

He intentado setWindowIcon, y establece con éxito el icono en la esquina superior izquierda de la ventana principal, pero no afecta el icono que se muestra en la barra de tareas de Windows 7 - el icono de la barra de tareas sigue siendo el icono de python predeterminado. Aquí está mi código:

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

[Actualización] He intentado colocar el setWindowIcon() antes de la show(). Lo he intentado con otras imágenes, ico y png. Nada ayuda.

+0

¿Configurar el ícono antes de '' mostrar() 'la ventana ayuda? –

+0

No, no importa si configuro el ícono antes de '.show()'. – DamonJW

+0

¿Has probado con otro archivo de imagen? Tu código funciona bien para mí con un archivo png aleatorio, aunque estoy usando KDE4. –

Respuesta

79

He encontrado la respuesta, después de algunas excavaciones.

En Windows 7, la barra de tareas no es para "Windows de aplicación" per se, es para "Modelos de usuario de aplicación". Por ejemplo, si tiene varias instancias diferentes de su aplicación ejecutándose, y cada instancia tiene su propio ícono, entonces todas se agruparán bajo un solo icono de la barra de tareas. Windows usa varias heurísticas para decidir si las diferentes instancias deben agruparse o no, y en este caso decidió que todo alojado por Pythonw.exe debería agruparse bajo el icono de Pythonw.exe.

La solución correcta es que Pythonw.exe le diga a Windows que solo aloja otras aplicaciones. Quizás un lanzamiento futuro de Python hará esto. De forma alternativa, puede agregar una clave de registro para decirle a Windows que Pythonw.exe es solo un host en lugar de una aplicación en sí misma. Consulte la documentación de MSDN para AppUserModelIDs.

Alternativamente, se puede utilizar una llamada de Windows desde Python, a decir explícitamente de Windows lo que el AppUserModelID correcto es que este proceso:

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

EDIT: Por favor, véase la respuesta de Ronan: la cadena myappid debe ser Unicode.

+0

Debe aceptar su propia respuesta si soluciona su problema. :) – Macke

+0

¡Gracias! Necesitaba lo mismo usando PySide. – BaldDude

+0

¿Cómo averiguar qué es myappid? – aBiologist

4

Debe establecer AppUserModelID antes de que su aplicación muestre alguna GUI. Si necesita acceder a otras características de Windows 7, puede echar un vistazo al Q7Goodies que es un complemento de Qt para Windows 7 con enlaces PyQt.

4

@ La respuesta de DamonJW funcionará, pero hay una pequeña pega: myappid debe ser unicode (el tipo de argumento es PCWSTR).

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

De lo contrario conseguir el AppUserModelID obtendrá caracteres Unicode equivocadas (祭潣灭湡⹹祭牰摯捵⹴畳灢潲畤瑣瘮牥楳湯):

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) 

Dicho esto, es una cosa menor, ya que Windows todavía reconocerá la cadena Unicode como "otro proceso" y cambiar el icono en consecuencia.

+0

No pude conseguir que tu código funcionara, pero la respuesta de @DamonJW funcionó para mí. – uruloke

+0

La primera parte de mi código es la misma que @ DamonJW's, excepto por el 'u' antepuesto en la cadena' myappid'. La segunda parte es solo el control de la cadena real que Windows está "viendo". –

+0

Agradable además. Es de suponer que esto no es un problema en Python 3 ya que todas las cadenas son unicode. – Snorfalorpagus

Cuestiones relacionadas