11

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

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

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

4

3 回答 3

9

Windows 上的 Tk 消息框系统提供的消息框。Tk 不使用 Tk 按钮和框架创建消息框,而是显示 Windows API 提供的常用对话框。

为了在这里查看您的报告,我运行了 Tcl/Tk 8.6、Python 3.4 和 Powershell,并让每个都显示一个消息框。如您所见,Tcl/Tk 的出现与我们预期的一样,但 Python 和 Powershell 都默认使用旧风格的非主题外观。

Windows 10 上的 Tk 消息框

其原因很可能与启动它的可执行文件中的嵌入式清单有关。Tcl/Tkwish可执行文件包含一个清单资源,表明应用程序支持主题公共控件库。python.exe 和 pythonw.exe 文件没有这样的资源。必要的清单嵌入在 tkinter 使用的 Tk86.dll 文件中,但我认为这需要与可执行文件相关联。我通过使用 Visual Studio 打开 pythonw.exe 文件并将现有的 RT_MANIFEST 资源替换为从 Tk86.dll 中提取的资源来测试这一假设。有了合适的清单,Python tkinter 消息框就会出现适当的主题: 使用嵌入式清单的 Python 3.4

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

有关清单资源的更多信息,请参阅“启用视觉样式”

于 2015-11-19T10:28:21.360 回答
3

获得正确主题对话框的更简单方法是使用pyinstaller. (py2exe可能也可以,但我有一段时间没用过那个模块了,如果我不需要的话,也不打算回去......)

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

错误信息 - 脚本

作为 .exe 运行时的错误消息:

错误消息 - .exe

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

编辑

看来您可以使用--manifestpyinstaller 中的选项添加清单文件,但是这似乎不是很适用,因为它似乎pyinstaller适合您。

如果您需要提示用户输入的主题对话框,请考虑使用 call ( link )的tkSimpleDialogttk主题版本。完全披露:我对原始模块进行了修改。ttkSimpleDialogtkSimpleDialog

于 2016-01-13T20:21:41.660 回答
1

文档

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

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

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

ttk使用系统样式来表示某些东西。Tkinter才不是。这它自己的风格。

于 2015-11-19T10:31:37.317 回答