2015-11-18 19 views
6

Zacząłem robić GUI z Tkinter i dodałem moduł tkMessageBox, jak również. Ale ostatnio odkryłem, że importowanie modułu daje bardziej "aktualne" wyniki: przyciski i pola tekstowe pojawiają się wraz z aktualnym stylem obecnego systemu operacyjnego. To jest: Przyciski Windows 10 są gładkie i niebieskie, a nie te zacieniowane, szare, blokowe przyciski z poprzednich wersji.Python: Tkinter/ttk Temat Box wiadomości

Ale niestety, nie mogę znaleźć sposób, aby korzystać z tej TTK tematyczne widgety na wspólnych okien dialogowych (te które importowane z tkMessageBox). Tak więc okna dialogowe OK/Cancel (na przykład) nadal pojawiają się z motywem, który nie należy do Windows 10.

Cała dokumentacja, którą sprawdzam, przenosi mnie do Tkinter.

+0

'ttk' nie zawiera wszystkich widżetów, a wiele z dołączonych widżetów nie zawiera opcji. – TigerhawkT3

+0

tylko elementy z modułu 'ttk' mogą być motywowane. 'ttk' =' themed tk'' – furas

+0

Zatem powodem, dla którego 'ttk' pokazuje układ Windows 10, ale' Tkinter' no, jest to, że Tkinter nie został zaktualizowany do Windows 10? – Xesa

Odpowiedz

5

Skrzynka komunikacyjna Tk w systemie Windows to w dołączonym komunikacie systemowym. Tk nie tworzy skrzynki wiadomości przy użyciu przycisków i ramek Tk, ale pokazuje okno dialogowe zapasów udostępniane przez interfejs API systemu Windows.

Aby sprawdzić raport tutaj, uruchomiłem Tcl/Tk 8.6, Python 3.4 i Powershell i kazałem każdemu pokazać skrzynkę na listy. Jak widać, Tcl/Tk pojawia się tak, jak się spodziewaliśmy, ale zarówno Python, jak i Powershell nie działają zgodnie ze starym niesmakowym wyglądem.

Tk messageboxes on Windows 10

Powodem tego jest najprawdopodobniej do czynienia z osadzonymi manifestuje się w pliku wykonywalnego, który uruchamia ten. Plik wykonywalny Tcl/Tk wish zawiera manifest zasobu, który stwierdza, że ​​aplikacja obsługuje tematyczną wspólną bibliotekę sterującą. Pliki python.exe i pythonw.exe nie mają takich zasobów. Niezbędny manifest jest osadzony w pliku Tk86.dll, który jest używany przez tkinter, ale myślę, że to musi być powiązane z plikiem wykonywalnym. Sprawdziłem tę hipotezę, otwierając plik pythonw.exe z Visual Studio i zastępując istniejący zasób RT_MANIFEST tym, który został wyodrębniony z Tk86.dll. Z odpowiednim manifestu w miejscu Python tkinter messagebox podchodzi poprawnie tematyce: Python 3.4 using embedded manifest

Podobno ten manifest mogą być dostarczone w postaci pliku XML w tym samym folderze co plik wykonywalny, ale w testowaniu tego, że nie wydają się działać. Musiałem faktycznie umieścić manifest w zasobach wykonywalnych.

Aby uzyskać więcej informacji o zasobach manifestu, zobacz temat "Enabling Visual Styles".

+0

Dziękuję za odpowiedź, to naprawdę wyjaśnia wszystko. Będę badać nieco więcej od tego punktu wyjścia, ale obawiam się, że modyfikacja tych plików z Visual Studio może zakończyć się niekompatybilnością z systemami uniksowymi. – Xesa

+0

Python exe i pliki manifestu nie mają nic wspólnego z Uniksem. Jest to tylko uwaga na temat programu, który pozwala systemowi Windows wiedzieć, że może włączyć tematyczny styl wizualny API dla wspólnej biblioteki kontrolnej. – patthoyts

+0

Czytelnik twojej odpowiedzi otworzył problem na trackerze CPython 'https: // bugs.python.org/issue27309'. Nie jestem głównym opiekunem tkintera, ale chciałbym, aby został uaktualniony, aby udostępnić wersje tematyczne wbudowanych okien dialogowych. Jeśli chcesz dodać więcej informacji lub podpisać umowę o współtwórcę i wnieść łatkę przynajmniej do systemu Windows, prosimy o kontakt. –

0

Z docs:

Począwszy Tk 8.5, moduł TTK stały się dostępne. Ten moduł zastępuje wiele (ale nie wszystkie) oryginalnych maszyn Tkintera. Użyj tego modułu, aby uzyskać następujące korzyści:
  • Wygląd specyficzny dla platformy. W wersjach poprzedzających Tk 8.5 jedną z najczęstszych skarg na aplikacje TK było to, że nie pasowały one do stylu różnych platform.

  • Moduł ttk umożliwia pisanie aplikacji w sposób ogólny, ale aplikacja może wyglądać jak aplikacja Windows w systemie Windows, jak aplikacja MacOS w systemie MacOS i tak dalej, bez żadnych zmian w programie.

  • Każdy możliwy inny wygląd jest reprezentowany przez nazwany motyw ttk. Na przykład klasyczny motyw daje wygląd oryginalnych widżetów Tkinter opisanych w poprzednich sekcjach.

ttk używa stylów systemowych do reprezentowania czegoś. Tkinter nie. Jest to własny styl.

+0

Wpływa to na widżety Tk, takie jak przyciski i pola edycji, ale okno wiadomości i plik są otwarte, okna dialogowe zapisywania plików zawsze były dostarczane przez implementacje systemu w systemie Windows. Na Unix Tk musi utworzyć własną wersję.W systemie MacOSX Tk wywołuje standardowe okna dialogowe systemu tam, gdzie to możliwe. – patthoyts

3

Łatwiejszy sposób na uzyskanie poprawnie tematycznych okien dialogowych polega na kompilowaniu skryptów Pythona do plików .exe przy użyciu pyinstaller. (py2exe może również działać, ale nie używałem tego modułu przez jakiś czas i nie planuję powrotu, jeśli nie muszę ...)

Komunikat o błędzie podczas uruchamiania jako skrypt python:

error message - script

komunikat o błędzie podczas uruchamiania jako .exe:

error message - .exe

próbowałem zmuszając inny motyw z ttk.Style().theme_use('clam') jednak okna dialogowe nie wydają się confo do tych tematów. Musi to być domyślny styl systemu użytkownika. Nadal lepsze niż Windows 98! dla testu przetestowałem na komputerze z systemem Windows 7 z Pythonem 2.7.

EDIT

Wydaje się, można dodać plik manifestu pomocą opcji w pyinstaller --manifest, jednak wydaje się, że to nie jest bardzo zastosowanie jakikolwiek ponieważ wydaje pyinstaller robi to za ciebie.

Jeśli potrzebujesz tematycznych okien dialogowych, które monitują użytkownika o wprowadzenie danych, zastanów się nad wersją o nazwie ttk: tkSimpleDialog o nazwie ttkSimpleDialog (link). Pełne ujawnienie: Dokonałem modyfikacji oryginalnego modułu tkSimpleDialog.