Python:Tkinter / ttk主题消息框

时间:2015-11-18 22:51:47

标签: python tkinter ttk tkmessagebox

我开始使用 Tkinter 制作GUI,我也添加了模块 tkMessageBox 。但最近我发现导入模块 ttk 会提供更多“最新”结果:按钮和文本框会显示当前操作系统的实际样式。这是:Windows 10按钮是普通和蓝色的,而不是以前版本的阴影灰色块状按钮。

但遗憾的是,我找不到在常用对话框(我从 tkMessageBox 导入的对话框)上使用这个 ttk 主题小部件的方法。因此,确定/取消对话框(例如)仍然显示不属于Windows 10的主题。

我检查的所有文档都会将我带到 Tkinter

3 个答案:

答案 0 :(得分:9)

Windows 上的Tk消息框系统提供的消息框。 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文件没有这样的资源。必要的清单嵌入在tkinter使用的Tk86.dll文件中,但我认为这需要与可执行文件相关联。我通过使用Visual Studio打开pythonw.exe文件并将现有的RT_MANIFEST资源替换为从Tk86.dll中提取的资源来测试此假设。使用合适的清单,Python tkinter消息框正确地为主题: Python 3.4 using embedded manifest

据说这个清单可以作为XML文件提供在与可执行文件相同的文件夹中,但是在测试时似乎没有用。我必须将清单实际嵌入可执行资源中。

有关清单资源的更多信息,请参阅"Enabling Visual Styles"

答案 1 :(得分:3)

获取正确主题对话框的更简单方法是使用pyinstaller将python脚本编译为.exe文件。 (py2exe也可能有用,但我暂时没有使用该模块,如果我不必......,

作为python脚本运行时出现错误消息:

error message - script

以.exe:

运行时出现错误消息

error message - .exe

我尝试使用ttk.Style().theme_use('clam')强制使用不同的主题,但对话框似乎并不符合这些主题。它必须默认为用户的系统风格。仍然比Windows 98感觉更好!为了记录,我在使用Python 2.7运行Windows 7的计算机上进行了测试。

修改

看起来您可以使用pyinstaller中的--manifest选项添加清单文件,但是看起来这并不适用,因为看起来pyinstaller会为您做这件事。

如果您需要提示用户输入的主题对话框,请考虑使用名为tkSimpleDialoglink)的ttkSimpleDialog的ttk主题版本。完全披露:我对原始tkSimpleDialog模块进行了修改。

答案 2 :(得分:0)

来自docs

 从Tk 8.5开始,ttk模块可用。该模块取代了许多(但不是全部)原始Tkinter机器。使用此模块可以获得以下优势:
  • 特定于平台的外观。在Tk 8.5之前的版本中,关于Tk应用程序的最常见抱怨之一是它们不符合各种平台的风格。

  • ttk模块允许您以通用方式编写应用程序,但您的应用程序可能看起来像Windows下的Windows应用程序,如MacOS下的MacOS应用程序,依此类推,无需对程序进行任何更改。

  • 每个可能的不同外观由命名的ttk主题表示。例如,经典主题为您提供了前面部分中描述的原始Tkinter小部件的外观。

ttk使用系统样式来表示某些内容。 Tkinter没有。 自己的风格。