Tkinter/ttk 主题化消息框?

14

我开始使用 Tkinter 制作GUI,并添加了模块 tkMessageBox。但最近我发现导入模块 ttk 可以获得更“更新”的结果:按钮和文本框将显示当前操作系统的实际风格。也就是说,Windows 10 的按钮是平面和蓝色亮度,而不是之前版本中那些阴影灰色的方块按钮。

但不幸的是,我找不到一种方法来在常见的对话框(即从tkMessageBox导入的对话框)中使用这些 ttk 主题小部件。所以确定/取消对话框(例如)仍然显示一个不属于 Windows 10 的主题。

我查看的所有文档都引用了 Tkinter


ttk 并不包含所有的小部件,而且许多已包含的小部件缺少选项。 - TigerhawkT3
只有来自 ttk 模块的元素可以进行主题化。ttk = themed tk - furas
所以 ttk 显示 Windows 10 布局而 Tkinter 没有显示,是因为 Tkinter 还没有更新到 Windows 10 吗? - Xesa
1
没有必要过多地使用加粗。 - Jonah Fleming
@JonahFleming 抱歉,我是 Stack Overflow 的新手,但现在我知道最好使用 code - Xesa
1
没关系 :) 我们都曾经是新手! - Jonah Fleming
3个回答

11

在Windows上,Tk messagebox实际上是系统提供的messagebox。Tk不使用Tk按钮和框架创建messagebox,而是显示Windows API提供的存储对话框。

为了检查此处的报告,我运行了Tcl/Tk 8.6、Python 3.4和Powershell,并让每个程序显示messagebox。正如您所看到的,Tcl/Tk出现的外观符合我们的预期,但Python和Powershell都默认采用旧式非主题外观。

在Windows10上的Tk消息框

造成这种情况的原因很可能与启动它的可执行文件中的嵌入式清单有关。 Tcl/Tk wish 可执行文件包含一个清单资源,指示应用程序支持主题常规控件库。python.exe和pythonw.exe文件没有此类资源。必要的清单被嵌入Tk86.dll文件中,该文件由tkinter使用,但我认为这需要与可执行文件关联。我通过使用Visual Studio打开pythonw.exe文件并替换现有的RT_MANIFEST资源来测试了这个假设。有了适当的清单,Python tkinter messagebox就可以正确地设置主题:

使用嵌入式清单的Python 3.4

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

请参阅"启用视觉样式"获取有关清单资源的更多信息。


谢谢你的回答,这真的解释得很清楚。我会从那个起点继续研究,但我担心从Visual Studio调整那些文件可能会导致与Unix系统不兼容。 - Xesa
Python可执行文件和清单文件与Unix无关。这只是一个关于程序的注释,让Windows知道它可以为公共控件库启用主题视觉样式API。 - patthoyts
1
你的回答读者在CPython跟踪器https://bugs.python.org/issue27309上开了一个问题。我不是主要的tkinter维护者,但我希望看到它升级,以便提供内置对话框的主题版本。如果您希望在那里添加更多信息,或签署贡献者协议并至少为Windows贡献补丁,请随意。 - Terry Jan Reedy

4
通过使用pyinstaller将Python脚本编译成.exe文件可以更轻松地获取正确主题的对话框。(py2exe也可能可行,但我已经有一段时间没有使用该模块了,如果不必要,我不打算回去...)运行Python脚本和.exe时出现的错误消息是相同的:

error message - script

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

编辑

看起来你可以使用--manifest选项在pyinstaller中添加清单文件,但是由于pyinstaller已经为您执行此操作,因此这似乎并不适用。

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


2
文档中:
从Tk 8.5开始,ttk模块变得可用。该模块替换了大部分(但不是全部)原始的Tkinter机制。使用此模块可以获得以下优势:
  • 平台特定的外观。在Tk 8.5之前的版本中,对Tk应用程序最常见的抱怨之一是它们不符合各个平台的样式。

  • ttk模块允许您以通用方式编写应用程序,但您的应用程序可以在Windows下看起来像Windows应用程序,在MacOS下看起来像MacOS应用程序等,而无需更改程序。

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

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


1
这会影响到Tk小部件,如按钮和编辑字段,但消息框和文件打开、文件保存对话框始终由Windows系统实现提供。在Unix上,Tk必须创建自己的版本。在MacOSX上,Tk尽可能调用系统标准对话框。 - patthoyts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接