2015-11-18 2 views
6

я начал делать графический интерфейс с Tkinter и я добавил модуль tkMessageBox, а также. Но недавно я обнаружил, что импорт модуля ttk дает больше «актуальных» результатов: появляются кнопки и текстовые поля с фактическим стилем текущей ОС. Это: кнопки Windows 10 являются прозрачными и голубоватыми, а не теми затененными серыми блочными кнопками из предыдущих версий.Python: Tkinter/TTK тематические сообщение Box

Но, к сожалению, я не могу найти способ использовать эту TTK тематические виджеты на общих диалоговых окнах (те, которые я импортированные из tkMessageBox). Так что ОК/Отмена диалогов (например) по-прежнему отображаются с темой, которая не относится к Windows 10.

Вся документация, которую я проверяю, приводит меня к Tkinter.

+0

'ttk' не включает все виджеты, и многие из включенных виджетах отсутствуют. – TigerhawkT3

+0

только элементы из модуля 'ttk' могут быть тематическими. 'ttk' =' themed tk' – furas

+0

Итак, причина, по которой 'ttk' показывает макет Windows 10, но' Tkinter' no, потому что Tkinter не обновлен до Windows 10? – Xesa

ответ

5

Почтовый ящик Tk на Windows is предоставленный системой почтовый ящик. Tk не создает почтовый ящик с помощью кнопок и фреймов Tk, но показывает диалоговое окно запаса, предоставляемое Windows API.

Чтобы проверить ваш отчет, я столкнулся с Tcl/Tk 8.6, Python 3.4 и Powershell и получил каждый, чтобы показать сообщение. Как вы можете видеть, Tcl/Tk выглядит так, как мы ожидали, но оба Python и Powershell по умолчанию ставят нестандартный внешний вид.

Tk messageboxes on Windows 10

Причиной этого является то, скорее всего, делать со встроенными манифестов в исполняемый файл, который запускает это. Исполняемый файл Tcl/Tk wish содержит ресурс манифеста, который заявляет, что приложение поддерживает тематическую общую библиотеку элементов управления. Файлы python.exe и pythonw.exe не имеют таких ресурсов. Необходимый манифест встроен в файл Tk86.dll, который используется tkinter, но я думаю, что это должно быть связано с исполняемым файлом. Я протестировал эту гипотезу, открыв файл pythonw.exe с помощью Visual Studio и заменив существующий ресурс RT_MANIFEST на тот, который был извлечен из Tk86.dll. С подходящим манифестом в месте Python Tkinter MessageBox идет правильно тематический: Python 3.4 using embedded manifest

Якобы этот манифест может быть предоставлена ​​в виде файла XML в той же папке, что и исполняемый файл, но тестирование этого, что не похож на работу. Я должен был внедрить манифест в исполняемые ресурсы.

Дополнительную информацию о ресурсах манифеста см. В разделе "Enabling Visual Styles".

+0

Спасибо за ответ, это все объясняет. Я буду изучать немного больше с этой начальной точки, но я боюсь, что настройка этих файлов из Visual Studio может закончиться несовместимостью с Unix-системами. – Xesa

+0

Файлы Python exe и манифеста не имеют никакого отношения к unix. Это всего лишь заметка о программе, которая позволяет Windows знать, что она может включать тематический API визуальных стилей для библиотеки общих элементов управления. – patthoyts

+0

Читатель вашего ответа открыл проблему на трекере CPython 'https: // bugs.python.org/issue27309'. Я не главный поддерживающий tkinter, но я бы хотел, чтобы он обновился, чтобы сделать доступными тематические версии встроенных диалоговых окон. Если вы хотите добавить там дополнительную информацию или подписать соглашение с автором и внести исправление, по крайней мере, для Windows, пожалуйста, не стесняйтесь. –

0

От docs:

Начиная с Tk 8.5, модуль TTK стал доступен. Этот модуль заменяет многие (но не все) оригинальные машины Tkinter. Используйте этот модуль для получения этих преимуществ:
  • Вид на платформу. В выпусках до Tk 8.5 одна из самых распространенных жалоб на приложения Tk заключалась в том, что они не соответствовали стилю различных платформ.

  • Модуль ttk позволяет вам писать ваше приложение в общем виде, но ваше приложение может выглядеть как приложение Windows под Windows, такое как приложение MacOS под MacOS и т. Д., Без каких-либо изменений в вашей программе.

  • Каждый возможный внешний вид представлен названной темой ttk. Например, классическая тема дает вам вид оригинальных виджетов Tkinter, описанных в предыдущих разделах.

ttk использует системные стили для представления чего-либо. Tkinter нет. Это собственный стиль.

+0

Это влияет на виджетов Tk, таких как кнопки и поля редактирования, но открытые и открытые файлы сообщений, диалоги сохранения файлов всегда обеспечивались системными реализациями в Windows. На Unix Tk необходимо создать свою собственную версию.На MacOSX Tk, где это возможно, вызывает системные стандартные диалоги. – patthoyts

3

Более простой способ получить правильные тематические диалоговые окна - это скомпилировать ваши скрипты python в .exe-файлы, используя pyinstaller. (py2exe также может работать, но я не использовал этот модуль через некоторое время и не планирую возвращаться, если мне не нужно ...)

Сообщение об ошибке при запуске в качестве сценария для питона:

error message - script

сообщение об ошибке при запуске как .exe:

error message - .exe

Я пытался принуждать другую тему с ttk.Style().theme_use('clam'), однако диалоговые окна, кажется, не confo rm к этим темам. Он должен по умолчанию соответствовать стилю системы пользователя. Все еще лучше, чем в окнах 98! для записи я тестировал на компьютере с Windows 7 с Python 2.7.

EDIT

Похоже, вы можете добавить файл манифеста, используя --manifest опцию в pyinstaller, однако оказалось, что это не очень применимо в любом случае, так как он кажется pyinstaller делает это для вас.

Если вам нужно тематические диалоги, побуждающие пользователю для ввода, рекомендуется использовать тематические версии ТТК в tkSimpleDialog под названием ttkSimpleDialog (link). Полное раскрытие: я внесла изменения в исходный модуль tkSimpleDialog.

Смежные вопросы