【问题标题】:Tkinter/ttk themed Message Box?Tkinter/ttk 主题的消息框?
【发布时间】:2016-02-20 21:27:29
【问题描述】:

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

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

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

【问题讨论】:

  • ttk 不包含所有小部件,并且许多包含的小部件缺少选项。
  • 只有模块 ttk 中的元素可以设置主题。 ttk = themed tk
  • 那么ttk 显示Windows 10 布局而Tkinter 没有的原因是因为Tkinter 还没有更新到Windows 10?
  • 没有理由这么用粗体
  • 没关系 :) 在某些时候我们都是新人!

标签: python tkinter ttk tkmessagebox


【解决方案1】:

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

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

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

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

编辑

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

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

【讨论】:

    【解决方案2】:

    来自docs

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

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

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

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

    【讨论】:

    • 这会影响 Tk 小部件,如按钮和编辑字段,但消息框和文件打开、文件保存对话框一直由 Windows 上的系统实现提供。在 Unix Tk 上必须创建它自己的版本。在 MacOSX Tk 上,尽可能调用系统标准对话框。
    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答,这真的说明了一切。我将从这个起点开始进行更多研究,但我担心从 Visual Studio 调整这些文件可能最终导致与 Unix 系统不兼容。
    • Python 的 exe 和清单文件与 unix 无关。这只是一个关于程序的注释,它让 Windows 知道它可以为公共控件库启用主题视觉样式 API。
    • 您的答案的读者在 CPython 跟踪器 https://bugs.python.org/issue27309 上打开了一个问题。我不是主要的 tkinter 维护者,但我希望看到它升级以使内置对话框的主题版本可用。如果您希望在此处添加更多信息,或签署贡献者协议并至少为 Windows 贡献一个补丁,请随意。
    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 2016-02-26
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    相关资源
    最近更新 更多