在ttk中设置按钮的浮雕

时间:2015-01-06 23:26:58

标签: python python-2.7 ttk

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

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

当我切换到ttk时,我现在无法改变按钮的浮雕。这是我无法弄清楚如何改变的唯一选择。

这应该只用一个按钮运行一个简单的窗口:

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选项中看到的内容:

ttkButton

正如你所看到的,我宣布了一个样式,将foreground设置为red,这样可行......所以我知道这个样式正在应用。我也知道sunken属性存在,因为按下时按钮会使用它。

为什么救济设置不起作用?

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

2 个答案:

答案 0 :(得分:3)

Tk主题系统根据使用布局和样式配置选项组合在一起的单独可视元素重新定义窗口小部件,以产生取决于所选主题和窗口小部件状态的窗口小部件的可视化表示。这允许Tk请求使用Windows Visual Styles 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 API绘制所有内容的不同主题中,布局可能包含border元素,该元素可以理解并使用borderwidthrelief选项。例如,这可以在“默认”和“经典”主题中完成。

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

答案 1 :(得分:0)

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