Python 2.7:通过 Ttk 的主题“通用对话框”tkinter 接口?

Posted

技术标签:

【中文标题】Python 2.7:通过 Ttk 的主题“通用对话框”tkinter 接口?【英文标题】:Python 2.7: Themed "common dialog" tkinter interfaces via Ttk? 【发布时间】:2011-04-28 19:32:51 【问题描述】:

Python 2.7(32 位)Windows:我们正在试验 Python 2.7 对主题 Tkinter (ttk) 的简单 GUI 支持,结果给人留下了深刻的印象!新主题支持似乎不足的一个方面是如何包装特定于操作系统的常用对话框。

更正:换句话说,MessageBoxColorChooser 常用对话框具有“难看”的 Win 95 风格块状按钮,而主题(圆形/渐变)按钮通常显示在 XP 下的这些常用对话框中、Vista 和 Windows 7。(我在所有 3 个平台上进行测试,结果相同,没有主题)。

注意:filedialog 常用对话框(askopenfilenameaskopenfilenamesasksaveasfilenameaskdirectory)都是正确的主题。

import tkMessageBox as messagebox
messagebox.showinfo()

import tkColorChooser as colorchooser
color = colorchooser.askcolor( parent=root, title='Customize colors' )

关于使 Tkinter 的 MessageBoxColorChooser 通用对话框与操作系统主题兼容(至少在 Windows XP 或更高版本下)需要什么的任何想法?

【问题讨论】:

这是一个很好的收获。我将把它带到 Python 的 Bug Tracker,看看我们是否能取得一些进展。 Rafe:感谢您更新 Python Bug Tracker 并解决这个问题。我很乐意帮助纠正这个问题。我不确定我可以明智地贡献代码,但我很乐意在多个版本的 Windows 上测试任何代码修复,例如。 XP、Vista、Windows 7。 这里是问题的链接,您可以随时查看源代码,看看是否有办法更正源代码。事情的运作方式是,虽然您不能单方面提交代码,但任何人都可以编写补丁并让他们查看。 bugs.python.org/issue10171 一个编辑位:格式化内联字符串的代码将它们放在反引号中,并格式化一段长代码将其缩进四个空格。您的编辑破坏了我在之前的编辑中所做的格式。 【参考方案1】:

您的观察基本上是正确的。我确实在messageboxcolorchooser 中看到了您所指的内容。但是,我的文件对话框似乎都有适当的圆形按钮等。

我对您制作消息框的建议是使用TopLevel 小部件创建您自己的消息框,然后定义您需要的内容以及不同按钮的适当行为(这肯定比仅使用消息框,但如果您真的需要新样式的按钮,它会起作用)。

但是,我认为您无法为colorchooser 问题拼凑出一个解决方案。

我曾一度认为 Python 3.1 可能已经解决了这个问题,但遗憾的是,我试过了,但事实并非如此。我想如果你需要用户选择一种颜色,那么按钮就必须是丑陋的。

【讨论】:

Rafe:是的,你是对的......文件对话框确实按预期呈现,并支持主题(圆形)按钮。缺乏主题支持似乎仅限于消息框和颜色选择器对话框。 我还注意到以下奇怪之处:所有文件对话框(和颜色选择器)都相对于父窗口的左上角显示...除了以桌面。 @Malcolm:这很奇怪。我想我永远不会独立注意到这一点。 我将开始一个新线程来讨论 Tkinter 常用对话框如何在显示器上定位自己的奇怪行为。 Rafe:我更新了我原来的问题,以纠正我关于文件对话框主题不正确的错误陈述。【参考方案2】:

获得更好看的对话框的一个选项是使用pyinstaller 将您的脚本编译为可执行文件。我更彻底地解释了这一点here。

tl;dr,使用pyinstaller 编译似乎允许您使用当前运行的操作系统样式的对话框,但不能使用自定义样式。

【讨论】:

以上是关于Python 2.7:通过 Ttk 的主题“通用对话框”tkinter 接口?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在一个Tkinter(tk.Tk)根窗口中使用两个不同的TTK主题吗?

tkinter.ttk — Tk themed widgets

tkinter ttk 主题:_tkinter.TclError:不支持图像文件格式“svg”

python tkinter与ttk

无法在 python tkinter 中导入 ttk

如何使用 tkinter/ttk 在 Python 3 中显示图像?