在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
元素、padding
和 label
.
所有这一切的结果是,在使用 vista 主题时,根本没有什么可以缓解的。按钮背景由 Windows 根据状态标志使用预定义的基于图像的 UI 元素绘制,并在顶部呈现一些其他元素。在使用 Tk APIs 绘制所有内容的不同主题中,布局可能包含理解和使用 borderwidth
和 relief
选项的 border
元素。例如,这是在 'default' 和 'classic' 主题中完成的。
如果您真的想自定义 Ttk 小部件,那么执行此操作的方法是定义支持您需要的视觉表示的新元素。您可以通过从另一个主题导入元素或使用其中一个元素引擎(图像或 vsapi)定义新元素来完成此操作。然后,您使用此元素声明一个新布局,并使用新样式创建一个兼容的小部件。
我意识到这是一个老问题,但我试图完成同样的事情,并且有一种更简单的方法来复制 tk.Button.configure(relief='sunken')
行为:ttk.Button.state(['pressed'])
。可以用ttk.Button.state(['!pressed'])
.
清除
希望我已经尽可能地缩小了范围。
我正在开发一个程序,我需要在屏幕上使用非常小的按钮并包含文本。我最初使用的是 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
元素、padding
和 label
.
所有这一切的结果是,在使用 vista 主题时,根本没有什么可以缓解的。按钮背景由 Windows 根据状态标志使用预定义的基于图像的 UI 元素绘制,并在顶部呈现一些其他元素。在使用 Tk APIs 绘制所有内容的不同主题中,布局可能包含理解和使用 borderwidth
和 relief
选项的 border
元素。例如,这是在 'default' 和 'classic' 主题中完成的。
如果您真的想自定义 Ttk 小部件,那么执行此操作的方法是定义支持您需要的视觉表示的新元素。您可以通过从另一个主题导入元素或使用其中一个元素引擎(图像或 vsapi)定义新元素来完成此操作。然后,您使用此元素声明一个新布局,并使用新样式创建一个兼容的小部件。
我意识到这是一个老问题,但我试图完成同样的事情,并且有一种更简单的方法来复制 tk.Button.configure(relief='sunken')
行为:ttk.Button.state(['pressed'])
。可以用ttk.Button.state(['!pressed'])
.