在ttk中设置按钮的浮雕

Setting the relief of a button in ttk

希望我已经尽可能地缩小了范围。

我正在开发一个程序,我需要在屏幕上使用非常小的按钮并包含文本。我最初使用的是 tk,但我无法将按钮指定为我想要的尺寸(它必须是非常具体的尺寸)。

当我切换到 ttk 时,我现在无法更改按钮的浮雕。这是我唯一不知道如何更改的选项。

这应该 运行 一个简单的 window 只有一个按钮:

import Tkinter as tk
import ttk
from ttk import Button, Style, Frame

root = tk.Tk()
style = ttk.Style()
style.configure('TButton', foreground='red', relief='sunken', padding=20)
mainframe = Frame(root)
button = Button(mainframe, text='test')
button.pack(padx=20, pady=20)
mainframe.pack()
root.mainloop()

这是我在 relief = 'sunken' 和未指定 relief 选项时看到的:

如您所见,我声明了一个样式,将 foreground 设置为 red,这有效...所以我知道该样式正在应用。我也知道 sunken 属性 在那里,因为按钮在您按下它时会使用它。

为什么缓解设置不起作用?

我不需要 tk 解决方案,我知道如何在 tk 中设置按钮的浮雕,但这在这里不起作用。

Tk 主题系统根据单独的视觉元素重新定义小部件,这些元素使用布局和样式配置选项组合在一起,以产生取决于所选主题和小部件状态的小部件的视觉表示。这允许 Tk 请求 Windows 视觉样式 API 用于绘制某些元素,以便我们可以正确匹配平台的标准用户体验。

在上面的示例中,您有一个 Ttk 按钮。这有许多可以使用 ttk.Style().layout('TButton') 查看的元素。此布局取决于当前主题,在 Windows 7 下,它看起来如下所示:

[('Button.button', {'children':
    [('Button.focus', {'children':
        [('Button.padding', {'children':
            [('Button.label', {'sticky': 'nswe'})],
        'sticky': 'nswe'})],
    'sticky': 'nswe'})],
'sticky': 'nswe'})]

这表明基本元素是 button 元素。这被定义为 VSAPI BP_PUSHBUTTON 部分,并且根据小部件状态(禁用、活动、按下等)将使用 Windows 定义的状态之一绘制元素(例如: PBS_PRESSED 当处于按下状态时)。另请注意,布局中没有 border 元素 - 只有 focus 元素、paddinglabel.

所有这一切的结果是,在使用 vista 主题时,根本没有什么可以缓解的。按钮背景由 Windows 根据状态标志使用预定义的基于图像的 UI 元素绘制,并在顶部呈现一些其他元素。在使用 Tk APIs 绘制所有内容的不同主题中,布局可能包含理解和使用 borderwidthrelief 选项的 border 元素。例如,这是在 'default' 和 'classic' 主题中完成的。

如果您真的想自定义 Ttk 小部件,那么执行此操作的方法是定义支持您需要的视觉表示的新元素。您可以通过从另一个主题导入元素或使用其中一个元素引擎(图像或 vsapi)定义新元素来完成此操作。然后,您使用此元素声明一个新布局,并使用新样式创建一个兼容的小部件。

我意识到这是一个老问题,但我试图完成同样的事情,并且有一种更简单的方法来复制 tk.Button.configure(relief='sunken') 行为:ttk.Button.state(['pressed'])。可以用ttk.Button.state(['!pressed']).

清除