2015-11-18 20 views
6

ho iniziato a fare una GUI con Tkinter e ho aggiunto il modulo tkMessageBox pure. Ma recentemente ho scoperto che importare il modulo ttk dà risultati più "aggiornati": i pulsanti e le caselle di testo appaiono con lo stile attuale del sistema operativo attuale. Questo è: i pulsanti di Windows 10 sono chiari e blu-illuminati, e non quelli ombreggiati dei pulsanti grigio a blocchi delle versioni precedenti.Python: Tkinter/TTK tema Message Box

Ma, purtroppo, non riesco a trovare un modo per utilizzare questa ttk widget a tema sulle finestre di dialogo comuni (quelli che ho importato dalla tkMessageBox). Quindi OK/Annulla finestre di dialogo (ad esempio) appaiono ancora con un tema che non appartiene a Windows 10.

Tutta la documentazione che controllo mi porta a Tkinter.

+0

'ttk' non include tutti i widget e molti dei widget inclusi mancano le opzioni. – TigerhawkT3

+0

solo gli elementi del modulo 'ttk' possono essere a tema. 'ttk' =' themed tk' – furas

+0

Quindi il motivo per cui 'ttk' mostra il layout di Windows 10 ma' Tkinter' no, è perché Tkinter non è stato aggiornato a Windows 10? – Xesa

risposta

5

La casella di messaggio Tk su Windows è la casella di messaggio fornita dal sistema. Tk non crea una messagebox utilizzando i pulsanti e i frame Tk ma mostra la finestra di dialogo di riserva fornita dall'API di Windows.

Per controllare il report qui ho eseguito Tcl/Tk 8.6, Python 3.4 e Powershell e ho ottenuto ciascuno di mostrare una messagebox. Come potete vedere, Tcl/Tk appare come ci aspettavamo, ma sia Python che PowerShell sono predefiniti per il look and feel vecchio stile.

Tk messageboxes on Windows 10

La ragione di questo è più probabile a che fare con manifesta incorporati nella eseguibile che lancia questo. L'eseguibile Tcl/Tk wish contiene una risorsa manifest che afferma che l'applicazione supporta la libreria di controlli comuni a tema. I file python.exe e pythonw.exe non dispongono di tali risorse. Il manifest necessario è incorporato nel file Tk86.dll utilizzato da tkinter ma penso che questo debba essere associato all'eseguibile. Ho verificato questa ipotesi aprendo il file pythonw.exe con Visual Studio e sostituendo la risorsa RT_MANIFEST esistente con quella estratta da Tk86.dll. Con un manifesto adatto al posto di Python Tkinter messagebox viene correttamente a tema: Python 3.4 using embedded manifest

Presumibilmente questo manifesto può essere fornito come file XML nella stessa cartella del file eseguibile, ma a testare questa che non sembra funzionare. Ho dovuto in realtà incorporare il manifest nelle risorse eseguibili.

Vedere "Enabling Visual Styles" per ulteriori informazioni sulle risorse manifest.

+0

Grazie per la tua risposta, questo spiega davvero tutto. Cercherò un po 'di più da quel punto di partenza, ma temo che il ritocco di quei file da Visual Studio possa finire con l'incompatibilità con i sistemi Unix. – Xesa

+0

I file exe e manifest di Python non hanno nulla a che fare con unix. Questa è solo una nota sul programma che consente a Windows di sapere che può abilitare l'API degli stili visivi tematici per la libreria dei controlli comuni. – patthoyts

+0

Un lettore della tua risposta ha aperto un problema sul tracker CPython 'https: // bugs.python.org/issue27309'. Non sono il manutentore principale di tkinter, ma mi piacerebbe vederlo aggiornato per rendere disponibili versioni a tema delle finestre di dialogo integrate. Se desideri aggiungere ulteriori informazioni lì o firmare l'accordo con il contributore e contribuire con una patch almeno per Windows, non esitare a contattarci. –

0

Dal docs:

partire con Tk 8.5, il modulo TTK si sono resi disponibili. Questo modulo sostituisce molto (ma non tutti) i macchinari originali di Tkinter. Utilizzare questo modulo per ottenere questi vantaggi:
  • Aspetto specifico della piattaforma. Nelle versioni precedenti a Tk 8.5, una delle lamentele più comuni sulle applicazioni Tk era che non erano conformi allo stile delle varie piattaforme.

  • Il modulo ttk consente di scrivere l'applicazione in modo generico, tuttavia l'applicazione può sembrare un'applicazione Windows in Windows, come un'app MacOS in MacOS e così via, senza alcuna modifica al programma.

  • Ogni aspetto diverso possibile è rappresentato da un tema ttk denominato. Ad esempio, il tema classico ti dà l'aspetto dei widget Tkinter originali descritti nelle sezioni precedenti.

ttk utilizza gli stili di sistema per rappresentare qualcosa. Tkinter no. È è il proprio stile.

+0

Ciò influisce sui widget Tk come pulsanti e campi di modifica, ma la finestra di messaggio e il file aperto, le finestre di dialogo di salvataggio dei file sono sempre stati forniti dalle implementazioni di sistema su Windows. Su Unix Tk deve creare la sua versione.Su MacOSX Tk richiama le finestre di dialogo standard di sistema laddove possibile. – patthoyts

3

Un modo più semplice per ottenere finestre di dialogo a tema correttamente consiste nel compilare gli script Python in file .exe utilizzando pyinstaller. (py2exe potrebbe anche funzionare, ma non ho usato quel modulo per un po 'e non ho intenzione di tornare indietro se non devo ...)

Messaggio di errore quando si esegue come script python:

error message - script

messaggio di errore quando si esegue come un exe:

error message - .exe

ho provato a forzare un tema diverso con ttk.Style().theme_use('clam'), tuttavia le finestre di dialogo non sembrano confo rm a quei temi. Deve impostare automaticamente lo stile del sistema dell'utente. Ancora meglio di Windows 98! per la cronaca, ho provato su un computer con Windows 7 con Python 2.7.

EDIT

Sembra è possibile aggiungere un file manifesto utilizzando l'opzione --manifest in pyinstaller, ma sembra che questo non è molto applicabile in ogni modo dal momento che sembra pyinstaller che fa per voi.

Se avete bisogno di finestre di dialogo a tema che spingono l'utente per l'input, è possibile utilizzare la versione a tema TTK di tkSimpleDialog chiamato ttkSimpleDialog (link). Full Disclosure: ho apportato le modifiche al modulo originale tkSimpleDialog.