0
点赞
收藏
分享

微信扫一扫

Python编程实例-Tkinter GUI编程-Ttk Elements

Ttk Elements

本文将介绍 ttk 元素以及如何将它们组装成小部件样式。

1、Ttk Elements介绍

到目前为止,您已经了解到主题是定义所有 ttk 小部件外观的样式集合。样式是对小部件类外观的描述。 样式由一个或多个元素组成。例如,标签由边框、填充和标签元素组成。 这些元素相互嵌套,如下图所示:

在这里插入图片描述

一般来说,大多数内置的 ttk 样式使用布局的概念来组织构建小部件的不同元素层。

要获取小部件类的布局,可以使用 Style 对象的 layout() 方法,如下所示:

style.layout(widget_class)

如果小部件类没有布局,则 layout() 方法将引发 tk.TclError 异常。layout() 方法返回一个元组列表 (element_name, description),其中:

  • element_name 是元素的名称。
  • description 是描述元素的字典。

以下示例使用 layout() 方法获取 TLabel 小部件类的布局:

import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        style = ttk.Style(self)

        layout = style.layout('TLabel')
        print(layout)


if __name__ == "__main__":
    app = App()
    app.mainloop()

以下输出显示了 TLabel 的样式布局:

在这里插入图片描述

[('Label.border',
    {'sticky': 'nswe',
     'border': '1',
     'children': [('Label.padding',
                   {'sticky': 'nswe',
                    'border': '1',
                    'children': [('Label.label',
                                  {'sticky': 'nswe'})]
                    })]
     }
)]

TLabel 具有三个相互嵌套的元素:

  • Label.border 是具有粘性、边框和子键的最外层元素。
  • Label.padding 嵌套在 Label.border 内。 它还具有粘滞键、边框键和子键。
  • Label.label 是最里面的元素,只有一个粘滞键。

例如,当一个元素有一个值为 nswe 的粘滞键时,它将被拉伸以附着在父元素的北、南、西和东。

请注意,小部件类的样式布局取决于当前主题。 如果更改主题,布局可能会有所不同。

2、Elements 选项

每个元素都有一个选项列表,用于指定元素的外观。 要获取选项名称列表,请使用 Style 对象的 element_options() 方法:

style.element_options(styleName)

以下程序显示了 Label.border、Label.padding 和 Label.label 元素的元素选项:

import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        style = ttk.Style(self)

        # layout
        layout = style.layout('TLabel')
        print(layout)

        # element options
        print(style.element_options('Label.border'))
        print(style.element_options('Label.padding'))
        print(style.element_options('Label.label'))


if __name__ == "__main__":
    app = App()
    app.mainloop()

输出:

('relief',)
('padding', 'relief', 'shiftrelief')
('compound', 'space', 'text', 'font', 'foreground', 'underline', 'width', 'anchor', 'justify', 'wraplength', 'embossed', 'image', 'stipple', 'background')

在此输出中:

  • Label.border 元素有一个选项:‘relief’。
  • Label.padding 元素具有三个选项:“padding”、“relief”和“shiftrelief”。
  • Label.label 元素有很多选项,包括 ‘font’、‘foreground’、‘with’ 等。

3、Elements 选项属性

要获取与元素选项关联的属性列表,请使用 Style 对象的 lookup() 方法:

style.lookup(layout_name, option_name)

以下示例显示了 TLabel.label 元素中字体、前景和背景选项的属性:

import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        style = ttk.Style(self)

        # attributes of the font, foreground, and background
        # of the Label.label element
        print(style.lookup('Label.label', 'font'))
        print(style.lookup('Label.label', 'foreground'))
        print(style.lookup('Label.label', 'background'))


if __name__ == "__main__":
    app = App()
    app.mainloop()

输出:

TkDefaultFont
SystemWindowText
SystemButtonFace

从输出中可以清楚地看到,字体是 TkDefaultFont,前景是 SystemWindowText,背景是 SystemButtonFace。

下面示例显示了如何更改 Label 小部件的外观:

import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.geometry('500x100')

        message = 'This is an error message!'

        label = ttk.Label(self, text=message, style='Error.TLabel')
        label.pack(expand=True)

        style = ttk.Style(self)

        style.configure('Error.TLabel', foreground='white')
        style.configure('Error.TLabel', background='red')
        style.configure('Error.TLabel', font=('Helvetica', 12))
        style.configure('Error.TLabel', padding=(10, 10))


if __name__ == "__main__":
    app = App()
    app.mainloop()
举报

相关推荐

0 条评论