Python: Cuadro de mensaje temático Tkinter / ttk

Comencé a hacer una GUI con Tkinter y también agregué el módulo tkMessageBox . Pero recientemente descubrí que al importar el módulo ttk se obtienen resultados más “actualizados”: los cuadros y los cuadros de texto aparecen con el estilo real del sistema operativo actual. Esto es: los botones de Windows 10 son planos e iluminados de color azul, y no esos botones de bloques grises sombreados de versiones anteriores.

Pero desafortunadamente, no puedo encontrar una manera de usar estos widgets temáticos de ttk en los cuadros de diálogo comunes (los que importé de tkMessageBox ). Por lo tanto, los cuadros de diálogo Aceptar / Cancelar (por ejemplo) siguen apareciendo con un tema que no pertenece a Windows 10.

Toda la documentación que compruebo me lleva a Tkinter .

El cuadro de mensaje Tk en Windows es el cuadro de mensaje proporcionado por el sistema. Tk no crea un cuadro de mensaje con los botones y marcos de Tk, pero muestra el diálogo de valores provisto por la API de Windows.

Para revisar su informe aquí, encontré Tcl / Tk 8.6, Python 3.4 y Powershell y conseguí que cada uno mostrara un mensaje. Como puede ver, Tcl / Tk aparece como es de esperar, pero tanto Python como Powershell están predeterminando el estilo y la apariencia no temática de estilo antiguo.

Tk cuadros de mensajes en Windows 10

Es probable que la razón de esto sea con los manifiestos incrustados en el ejecutable que lo inicia. El ejecutable de wish Tcl / Tk contiene un recurso de manifiesto que indica que la aplicación es compatible con la biblioteca de controles comunes temáticos. Los archivos python.exe y pythonw.exe no tienen tales recursos. El manifiesto necesario está incrustado en el archivo Tk86.dll que usa tkinter, pero creo que esto debe estar asociado con el ejecutable. Probé esta hipótesis abriendo el archivo pythonw.exe con Visual Studio y reemplazando el recurso RT_MANIFEST existente con el extraído de Tk86.dll. Con un manifiesto adecuado en su lugar, el cuadro de mensaje tkinter de Python aparece correctamente temático: Python 3.4 utilizando manifiesto incrustado

Supuestamente, este manifiesto puede proporcionarse como un archivo XML en la misma carpeta que el ejecutable, pero al probar esto no parece funcionar. Tuve que incrustar el manifiesto en los recursos ejecutables.

Consulte “Habilitación de estilos visuales” para obtener más información sobre los recursos de manifiesto.

Una forma más fácil de obtener los cuadros de diálogo temáticos correctamente es comstackndo sus scripts de Python en archivos .exe usando pyinstaller . ( py2exe también podría funcionar, pero no he usado ese módulo por un tiempo y no pienso volver si no tengo que …)

Mensaje de error cuando se ejecuta como un script en python:

mensaje de error - script

Mensaje de error cuando se ejecuta como un archivo .exe:

mensaje de error - .exe

Intenté forzar un tema diferente con ttk.Style().theme_use('clam') , sin embargo, los cuadros de diálogo no parecen ajustarse a esos temas. Debe predeterminarse al estilo del sistema del usuario. ¡Aún mejor que las ventanas 98 se sienten! para el registro, lo probé en una computadora con Windows 7 con Python 2.7.

EDITAR

Parece que puede agregar un archivo de manifiesto utilizando la opción --manifest en pyinstaller, sin embargo, parece que esto no es muy aplicable de todos modos ya que parece que pyinstaller hace por usted.

Si necesita cuadros de diálogo temáticos que soliciten al usuario una entrada, considere usar la versión temática ttk de tkSimpleDialog llamada ttkSimpleDialog ( enlace ). Revelación completa: hice las modificaciones al módulo tkSimpleDialog original.

De los documentos :

A partir de Tk 8.5, el módulo ttk estuvo disponible. Este módulo reemplaza gran parte (pero no toda) de la maquinaria original de Tkinter. Utilice este módulo para obtener estas ventajas:

  • Aspecto específico de la plataforma. En versiones anteriores a Tk 8.5, una de las quejas más comunes sobre las aplicaciones de Tk era que no se ajustaban al estilo de las distintas plataformas.

  • El módulo ttk le permite escribir su aplicación de una manera genérica, sin embargo, su aplicación puede parecerse a una aplicación de Windows en Windows, como una aplicación de MacOS en MacOS, y así sucesivamente, sin ningún cambio en su progtwig.

  • Cada posible apariencia diferente está representada por un tema ttk nombrado. Por ejemplo, el tema clásico le da la apariencia de los widgets Tkinter originales descritos en las secciones anteriores.

ttk usa los estilos del sistema para representar algo. Tkinter no lo hace. Es su propio estilo.