Python Tk GUI系列笔记(ttkbootstrap篇上) 43章~49章
水母山楂
编辑于 2024年02月13日 18:26
收录于文集
共15篇

〇、前言 此系列主要介绍tkinter库——Tk图形用户界面(GUI)及其相关内容,内容参考以下网站: TkDocs:https://tkdocs.com/(前四十一章) C语言中文网:http://c.biancheng.net/tkinter/(前三十一章) Python tkinter(GUI编程)模块最完整教程(上/中/下):(前四十一章) https://blog.csdn.net/qq_48979387/article/details/125706562 https://blog.csdn.net/qq_48979387/article/details/125806479 https://blog.csdn.net/qq_48979387/article/details/125768994 Python tkinter一些十分灵活的运用方式和实用函数:(第四十二章) https://blog.csdn.net/qq_48979387/article/details/119695934 tkinter.ttk --- Tk 风格的控件: https://docs.python.org/zh-cn/3.11/library/tkinter.ttk.html(33~41章) Tcl/Tk文档: https://www.tcl.tk/man/tcl8.6/TkCmd/contents.html(前四十二章) ttkbootstrap:https://ttkbootstrap.readthedocs.io/en/latest/zh/(43~53章) 其他参考会在章节前列出 部分内容来源网络 # 操作系统为Windows 7 Python版本3.10,Tk版本8.6 运行结果的窗口图片会缩放到80%,96 dpi 有些运行结果会使用gif动图展示,或是有额外的补充文件,需到Python tkinter result文件中的查看 # gif录制软件:ScreenToGif # 此系列的WPS笔记会在本系列的最后一个专栏给出 颜色代表含义: 淡灰色:注释,一般前面有# 绿色:示例 橙色:补充 紫色:示例中的input用户输入内容 红色、蓝色:突出或装饰文字作用 部分内容可能不严谨或者错误,欢迎指出

cut-off

四十三、ttkbootstrap——基于tkinter的界面美化库

(1)、概念

ttkbootstrap第三方库是一个基于tkinter的界面美化库,用其可以开发出类似前端bootstrap风格的tkinter桌面程序

# 官方文档:https://ttkbootstrap.readthedocs.io/en/latest/zh/

# 使用的版本:1.10.1

(2)、特点

# 摘编自官方文档

· 内置主题

· 预定义样式

· 简单的关键字API

· 许多新的控件

· 内置主题创建器

(3)、安装

https://ttkbootstrap.readthedocs.io/en/latest/zh/gettingstarted/installation/

(4)、创建应用程序

使用tkinter中的Tk类,或者使用ttkbootstrap模块中新的Window类

在导入时,导入ttkbootstrap来代替ttk。控件的style属性被bootstyle代替

# 但是,个人在Pycharm中bootstyle并没有代码补充并且会意外实参警告,且个人测试style属性和bootstyle属性基本一致,所以后面在tkinter原有控件使用style,新控件使用bootstyle

# style属性会检查当前主题是否存在样式而bootstyle不会,这个操作需要用到Style类中的实例,而Style类实例在用Window类创建主窗口时自动创建而Tk类不会。所以如果在使用Tk类创建主窗口而且想使用style属性时,必须先调用Style()创建一个实例(这个实例会保存在Style类里的instance属性中)

# 这里的Style类是ttkbootstrap中的而非tkinter.ttk

补充:ttkbootstrap包下的constants模块

这个模块导入了tkinter.constants中的所有常量并额外添加了一些常量,使用from ttkbootstrap import *或from ttkbootstrap.constants import *时可使用这些常量

可使用以下形式导入ttkbootstrap:

import tkinter as tk

import ttkbootstrap as ttk

from ttkbootstrap.constants import *

from ttkbootstrap import *

补充:使用ttkbootstrap.tk和ttkbootstrap.ttk可以调用tkinter和tkinter.ttk中的类、函数等

示例:

代码块
Python
自动换行
复制代码
from ttkbootstrap import *
# root = tk.Tk()  # 传统方法
# Style()  # 传统方法使用样式需先创建一个Style类实例(新方法自动创建)
root = Window()  # 新方法

btn = Button(text='按钮', style=DANGER)
btn.pack()

root.mainloop()
复制成功

运行结果:

将第二、三行的注释去掉,将第四行注释后的运行结果:

(5)、选择主题

默认主题是litera

内置主题有:cosmo, flatly, litera, minty, lumen, sandstone, yeti, pulse, united, morph, journal, darkly, superhero, solar, cyborg, vapor, simplex, cerculean

可以在这里查看这些主题:https://ttkbootstrap.readthedocs.io/en/latest/zh/themes/

在cmd中键入命令python -m ttkbootstrap(或者py -m ttkbootstrap)也可以查看这些主题

在创建Window类实例时指定themename参数,在创建Style实例时传入主题名,使用Style实例的theme_use()方法都能选择主题

示例:

代码块
Python
自动换行
复制代码
from ttkbootstrap import *

root = Window(themename='darkly')  # 方法1
Style('darkly')  # 方法2
root.style.theme_use('darkly')  # 方法3
复制成功

(6)、使用样式

在控件的bootstyle属性或style属性传入样式颜色和样式类型使用样式

1.传入参数的关键字

传入bootstyle或style的关键字非常灵活,关键字可以传入字符串,也可以可迭代对象。在后台有一个正则表达式,用于分析输入的关键字并将其转换为适当的ttk样式。以下的变体都是合法的,都会产生相同的样式:

'info-outline&#​39;

'infooutline&#​39;

'info outline&#​39;

'outline-info&#​39;

('info&#​39;, 'outline&#​39;)

(INFO, OUTLINE)

# 如果使用字符串,建议用短划线分隔,如上面第一个示例;如果使用常量,如果常量是多个建议用列表或元组,如上面最后一个示例

2.样式颜色

样式颜色可用于所有控件,关键字如下:

'primary&#​39;(主要):大多数控件的默认颜色

'secondary&#​39;(次要):通常是灰色

'success&#​39;(成功):通常是绿色

'info&#​39;(信息):通常是蓝色

'warning&#​39;(警告):通常是橙色

'danger&#​39;(危险):通常是红色

'light&#​39;(亮色):通常是浅灰色

'dark&#​39;(暗色):通常是深灰色

内置主题实际颜色指在ttkbootstrap.themes.standard模块中定义:

https://ttkbootstrap.readthedocs.io/en/latest/zh/themes/definitions/

内置主题的所有样式颜色和主题中其他颜色见下图:

代码:

代码块
Python
自动换行
复制代码
from tkinter import *
from ttkbootstrap.colorutils import color_to_rgb  # 转换颜色
from ttkbootstrap.themes.standard import STANDARD_THEMES
KEYWORD = ['primary', 'secondary', 'success', 'info', 'warning', 'danger', 'light', 'dark', 'bg', 'fg', 'selectbg',
           'selectfg', 'border', 'inputfg', 'inputbg', 'active']
root = Tk()


def is_dark(color):
    """如果颜色是暗色,则返回True,否则返回False"""
    r, g, b = color_to_rgb(color)
    luminance = ((0.299 * r) + (0.587 * g) + (0.114 * b)) / 255
    return luminance < 0.5


# 创建关键字行
for i, k in enumerate(KEYWORD, start=1):
    lbl = Label(text=k, relief=SOLID, anchor='center', width=9)
    lbl.grid(row=0, column=i, sticky=EW)

# 创建主题及其对应关键字下的颜色
for row, theme in enumerate(STANDARD_THEMES, start=1):
    lbl = Label(text=theme, relief=SOLID, anchor='center', width=9)
    lbl.grid(row=row, column=0)
    colors = STANDARD_THEMES[theme]['colors']
    for column, color in enumerate(colors, start=1):
        rel_color = colors[color]
        # 这里设置width和height为0的目的是使其适用单元格尺寸
        lbl = Label(background=rel_color, width=0, height=0, text=rel_color)
        lbl.grid(row=row, column=column, sticky=NSEW)

        if is_dark(rel_color):  # 如果颜色是暗色,则前景色为白色,否则为默认的黑色
            lbl.config(fg='white')

root.mainloop()
复制成功

3.样式类型

不同的控件有不同的样式类型,例如按钮控件有solid和outline类型。所有的样式类型在后文说明

示例:

代码块
Python
自动换行
复制代码
from ttkbootstrap import *
root = Window()

btn1 = Button(text='按钮1', style=(INFO, SOLID))
btn2 = Button(text='按钮2', style=(WARNING, OUTLINE))
btn1.pack(side=LEFT, padx=5, pady=10)
btn2.pack(side=LEFT, padx=5, pady=10)

root.mainloop()
复制成功

运行结果:

补充:如果导入ttkbootstrap,则tkinter中的控件(不是ttk)有额外的autostyle属性,这个属性默认为True,这意味ttkbootstrap处理这些旧版控件的样式。如果值为False,则控件样式由用户处理

四十四、ttkbootstrap窗口类

(1)、主窗口类(Window)

1.概念

包装tkinter.Tk类的类,继承自tkinter.Tk,以便提供一个更方便的API,并有额外功能

2.构造方法

ttkbootstrap.window.Window(title='ttkbootstrap&#​39;, themename='litera&#​39;, iconphoto='&#​39;, size=None, position=None, minsize=None, maxsize=None, resizable=None, hdpi=True, scaling=None, transient=None, overrideredirect=False, alpha=1.0)

# 这些参数大多是调用Tk中原有的方法

title——窗口的标题

themename——应用的主题名

iconphoto——窗口图标的路径。在内部它被传递给Tk.iconphoto方法。默认使用ttkbootstrap的图标。如果想禁用这一默认行为,设置该值为None并直接使用Tk.iconphoto或Tk.iconbitmap方法

size——窗口的尺寸。值是一个二元组(宽度, 高度)

position——窗口在屏幕上相对于左上角的距离。值是一个二元组(x, y)

# 如果想指定距离屏幕右下角的距离,使用控件方法geometry()

minsize——窗口允许被调整的最小宽度和高度。值是一个二元组(宽度, 高度)

maxsize——窗口允许被调整的最大宽度和高度。值是一个二元组(宽度, 高度)

resizable——指示是否可以改变窗口的宽度和高度。值是一个二元组(是否能改变宽度, 是否能改变高度)

hdpi——是否启用对Windows操作系统的高分辨率支持

scaling——Tk中单位尺寸(如厘米、英里、毫米)和像素之间的缩放系数与窗口中每个字符中每个点的像素数。值是一个浮点数

transient——指示窗口管理器该窗口对于传入参数的窗口是临时的

overrideredirect——指示窗口管理器是否忽略该窗口。值是布尔值

alpha——指定窗口的不透明度,值为浮点数,值范围0.0(完全透明)~1.0(不透明)

3.实例只读属性

3.1.style

返回ttkbootstrap.style.Style对象

4.实例方法

4.1.place_window_center(self)

# 别名:position_center

将顶层窗口放在屏幕中央。不考虑标题栏的高度

(2)、顶层窗口类(Toplevel)

1.概念

包装tkinter.Toplevel 类的类,继承自tkinter.Toplevel ,以便提供一个更方便的API,并有额外功能

2.构造方法

ttkbootstrap.window.Toplevel(title='ttkbootstrap&#​39;, iconphoto='&#​39;, size=None, position=None, minsize=None, maxsize=None, resizable=None, transient=None, overrideredirect=False, windowtype=None, topmost=False, toolwindow=False, alpha=1.0, **kwargs)

# windowtype是X11上的特定参数

topmost——窗口是否顶置

toolwindow——窗口是否设置为工具窗口样式

kwargs——其他属性项

 

剩余参数见Window类的构造函数

# 顶层窗口实例的只读属性和方法与Window类实例一致

四十五、ttkbootstrap不同控件的特殊样式

# 括号中的字符串是对应样式类型

# 没有特殊样式类型的控件不会列出

(1)、标签控件(Label)

1.默认样式

使用主题定义的前景和背景色。前景可使用样式颜色改变

2.倒转标签(inverse)

将标签的背景色和前景色颠倒

示例:

 

(2)、按钮控件(Button)

1.实心按钮(solid, 默认)

纯色背景,鼠标悬浮在按钮上或按下时按钮变暗。有焦点时,按钮内出现虚线框

2.外框按钮(outline)

有纤细的轮廓。鼠标悬浮在按钮上或按下时按钮变为纯色背景。有焦点时,按钮内出现虚线框

3.链接按钮(link)

具有标签控件外观的背景。鼠标悬浮在按钮上或按下时样式颜色变为info。有焦点时,按钮内出现虚线框

4.禁用按钮

设置状态为disabled应用该样式

示例:

(3)、单选框按钮控件(Radiobutton)

1.默认样式

默认样式有一个圆形指示器。当处于选择状态时,这个指示器被填充为默认或selected状态的颜色

2.实心工具按钮(toolbutton)

实心矩形按钮,没有选中时具有柔和的灰色背景,selected或active状态时是样式颜色的背景

3.外框工具按钮(outline-toolbutton)

有纤细的轮廓的矩形按钮,没有选中时有一个轮廓,selected或active状态时是纯色背景

4.禁用按钮

设置状态为disabled应用该样式

示例:

 

多选框按钮控件(Checkbutton)

1.默认样式

默认样式有方形多选框和标签。没有选中时具有柔和的灰色背景,选中时具有带多选标记的实心正方形

2.工具按钮(toolbutton)

3.外框工具按钮(outline-toolbutton)

见“单选框按钮控件”

4.圆形切换按钮(round-toggle)

带有圆形指示器的圆形按钮,当切换关闭和启用状态时会改变颜色和圆形指示器的位置。关闭时,该按钮具有柔和颜色的指示器和轮廓;启用时,该按钮填充默认颜色或样式颜色和带有强调的指示器

5.方形切换按钮(square-toggle)

带有方形指示器的方形按钮,其他与圆形切换按钮类似

6.禁用多选按钮

设置状态为disabled应用该样式

示例:

(5)、滚动条控件(Scrollbar

1.默认样式

默认样式是一个带有方形边缘的滑块

2.圆形样式(round)

圆形样式是一个带有圆形边缘的滑块

示例:

(6)、微调框控件(Spinbox)

1.默认样式

默认边框颜色是柔和的,在hover状态时改变边框颜色和上下箭头的颜色为样式颜色,在focus状态时增加边框厚度,并且也改变上下箭头的颜色为样式颜色

2.禁用微调框

3.只读微调框

设置状态为disabled, readonly应用相应的样式

4.无效微调框

当输入控件的值验证失败时(invalid状态)应用该样式

示例:

# 输入框控件和组合框控件与此类似

(7)、标尺控件(Scale)

1.默认样式

具有纤细灰色槽和一个圆形的样式颜色的滑块手柄。滑块手柄在hover状态时变亮,在pressed状态时变暗

2.禁用标尺

设置状态为disabled应用该样式

示例:

# 示例这里使用danger样式颜色更明显

(8)、菜单按钮控件(MenuButton)

1.实心菜单按钮(solid, 默认)

2.外框菜单按钮(outline)

3.禁用菜单按钮

见“按钮控件”

示例:

(9)、进度条控件(Progressbar)

1.实心进度条(solid, 默认)

纯色指示条

2.条纹进度条(striped)

指示条由样式颜色和该颜色的不饱和颜色交替组成的条纹

示例:

 

四十六、ttkbootstrap日期输入控件(DateEntry)

(1)、概念

日期输入控件结合了一个输入控件和一个按钮控件,按钮控件的回调是Querybox中的get_date()

当按钮控件被按下时,会弹出一个日期选择对话框,返回值被插入到输入控件中。如果输入框中的日期符合dateformat参数指定的格式,则日期选择对话框中的焦点日期(弹出时显示的日期)将会为这个日期

日期选择对话框的一周的第一天由firstweekday参数指定

日期输入控件继承自Frame类

(2)、演示图

(3)、构造方法

ttkbootstrap.widgets.DateEntry(master=None, dateformat='%x&#​39;, firstweekday=6, startdate=None, bootstyle='&#​39;, **kwargs)

master——指定父控件

dateformat——指定日期按该参数指定的格式化符号格式化。默认值'%x&#​39;代表本地化的适当日期表示

firstweekday——指定一周的第一天(0表示星期一,6表示星期天)

startdate——指定控件显示时的日期(焦点日期),值是date或datetime对象。默认是当前日期

bootstyle——指定样式

kwargs——指定传入框架控件的其他关键字参数

# dateformat, firstweekday等参数也是窗口控件的属性,它们也可以通过configure()方法修改(该方法在控件内部类中被重写)

# 格式化符号见下面网址内置模块time中strftime()函数format参数的值:

https://www.bilibili.com/read/cv24704295?spm_id_from=333.999.list.card_opus.click​

(4)、实例属性

1.button

2.entry

button和entry分别对应日期输入控件中的按钮控件和输入控件

示例:

代码块
Python
自动换行
复制代码
# 实现日期与天数相加
from ttkbootstrap import *
from datetime import datetime, timedelta
root = Window()

# 创建日期输入控件,一周第一天指定星期一,显示时的日期是2023年1月1日
datent = DateEntry(firstweekday=0, startdate=datetime(year=2023, month=1, day=1))
datent.pack(side=LEFT)

# 创建加符号标签
add_sign_lbl = Label(text='+', font=(None, 30))
add_sign_lbl.pack(side=LEFT)

# 创建输入控件
ent = Entry()
ent.pack(side=LEFT)

# 创建(天和)等于符号控件
add_sign_lbl = Label(text='天=', font=(None, 30))
add_sign_lbl.pack(side=LEFT)

# 创建结果标签控件
result_lbl = Label(width=15, style=(PRIMARY, INVERSE), font=(None, 17))
result_lbl.pack(side=LEFT)


def calc():
    """计算日期并填入结果标签控件"""
    # 获取日期并将其转换为datetime对象,获取天数将其转换为timedelta对象
    # datetime是日期时间对象,timedelta是时间间隔对象
    dt = datetime.strptime(datent.entry.get(), '%x')  # strptime()将字符串按后面的格式化符号解释
    td = timedelta(days=int(ent.get()))  # 指定时间间隔天数
    # 填入结果
    res_dt = dt + td
    result_lbl.config(text=res_dt.strftime('%x'))  # strftime()将日期时间对象转换为日期格式化字符串


# 创建计算按钮控件
btn = Button(text='计算', command=calc)
btn.pack(before=datent, side=BOTTOM)

root.mainloop()
复制成功

运行结果:

# 电脑如果设置是不同地区,日期显示格式会不同

运行时:

重新选择日期,填入天数,并按下计算按钮:

 

# 日期输入控件的特殊样式与微调框控件类似

四十七、ttkbootstrap水尺控件(Floodgauge)

(1)、概念

水尺控件是一个带有可选的文本指示器,显示长时间运行状态的控件

它与进度条控件类似,都有确定模式和不确定模式

控件的控制变量他会自动生成,可通过控件对象的textvariable和variable属性获取

# 这两个属性可以使用控件中的cget()方法,也可以使用Python的“控件.属性”方法

水尺控件继承自Progressbar类

(2)、演示图

(3)、构造方法

ttkbootstrap.widgets.Floodgauge(master=None, cursor=None, font=None, length=None, maximum=100, mode='determinate&#​39;, orient='horizontal&#​39;, bootstyle='primary&#​39;, takefocus=False, text=None, value=0, mask=None, **kwargs)

text——显示在水尺控件上的文本。这会传到textvariable控制变量的值

mask——一个格式化字符串,用于在更新数据时更新水尺上的文本。如果设置则忽略text

# 在内部它会在控制变量更新时调用“mask.format(value)”

**kwargs——指定传入进度条控件的其他关键字参数

# 其他参数和方法见进度条控件

示例:

代码块
Python
自动换行
复制代码
# 这个示例和进度条控件的示例差不多,区别是添加了进度占比显示和调整间距
import random
import time
from ttkbootstrap import *
from threading import Thread
root = Window()


def task():
    def func():
        btn.state(['disabled'])
        for x in range(100):
            prob.step(1)
            # 随机数据量
            data = list(range(random.randint(100000, 1000000)))
            for y in data:
                time.sleep(5e-1000)  # 模拟处理数据,同时防止内存使用过大
        btn.state(['!disabled'])

    # 使用多线程,保证窗口线程继续更新
    t = Thread(target=func)
    t.start()


prob = Floodgauge(mask='加载中...{}%')
btn = Button(text='启动任务', command=task, takefocus=0)
prob.pack(pady=10)
btn.pack(pady=10)

root.mainloop()
复制成功

运行结果:

四十八、ttkbootstrap仪表控件(Meter)

(1)、概念

仪表控件可用于显示长时间运行操作的进度或完成量。当interactive属性为True时,也可作为一个调节盘使用

仪表控件非常灵活:它可以用metertype设置仪表类型,用arcrange和arcoffset设置圆的弧度,也可以用stripethickness设置仪表指示器(周围的圆弧部分)显示为条纹

仪表控件继承自Frame类

(2)、演示图

(3)、构造方法

ttkbootstrap.widgets.Meter(master=None, bootstyle='default&#​39;, arcrange=None, arcoffset=None, amounttotal=100, amountused=0, wedgesize=0, metersize=200, metertype='full&#​39;, meterthickness=10, showtext=True, interactive=False, stripethickness=0, textleft=None, textright=None, textfont='-size 20 -weight bold&#​39;, subtext=None, subtextstyle='default&#​39;, subtextfont='-size 10&#​39;, stepsize=1, **kwargs)

(4)、构造方法参数

# 没有提到的参数见其他控件中的同名参数

1.arcrange

弧线的范围:弧线从起点到终点所对圆心角的度数。值是整数,单位是度

在'full&#​39;仪表类型,默认值360;在'semi&#​39;仪表类型,默认值270

# 实测值也可以是浮点数

2.arcoffset

弧线起始角度的偏移量,值是整数,单位是度。弧所对圆心所在的x轴正半轴为0度

在'full&#​39;仪表类型,默认值-90;在'semi&#​39;仪表类型,默认值135

示例:

arcrange=90, arcoffset=90, interactive=True:

3.amounttotal

仪表控件的最大值

4.amountused

仪表控件的当前值

5.showtext

值为布尔值,是否在仪表控件上显示左边、中间和右边的文本标签

# 左边、右边的文本标签分别由textleft和textright指定,中间的是当前值

6.textleft

在中间文本左边插入短字符串

7.textright

在中间文本右边插入短字符串

8.textfont

中间文本的字体

9.subtext

在中间文本下方补充文本

10.subtextstyle

补充文本的样式

11.subtextfont

补充文本的字体

12.wedgesize

设置弧线周围楔形指示器的长度。如果值大于0,则这个楔形指示器被设置为以当前值为中心,根据该参数值向两侧扩展长度。否则这个楔形指示器被设置为弧线起始位置到当前值位置的弧线

13.metersize

指定弧线所在正方形的边长

# 也就是框架控件的边长,框架控件是正方形

14.metertype

指定仪表类型,值可以是'full&#​39;或'semi&#​39;,分别是完整的圆和半圆

# 这里的半圆不是标准的180°圆,而是270°圆(外形类似测网速的仪表),原文是semi-circle

15.meterthickness

仪表指示器的厚度

16.interactive

值是布尔值,表示用户是否可以通过鼠标来调整仪表值。默认是False

17.stripethickness

如果值大于0,则楔形指示器会从实心变为条纹,该参数值指定每个条纹的厚度(或长度)

# 实测如果wedgesize大于0,则该参数无效

18.stepsize

指定用户用鼠标来调整仪表值时,每步的增长量

示例:

stripethickness=2, interactive=True, stepsize=5:

# 只能调整值为5的倍数

(5)、实例属性

1.amounttotalvar

仪表控件最大值的控制变量

2.amountusedvar

仪表控件当前值的控制变量

3.indicator

用于用户通过鼠标操作的标签控件

4.labelvar

补充文本的控件变量

5.meterframe

仪表控件内部的框架控件

6.subtext

补充文本的标签控件

7.textcenter

中间文本的标签控件

8.textframe

左边、中间和右边的文本标签的框架控件

9.textleft

左边文本的标签控件

10.textright

右边文本的标签控件

(6)、方法

1.step(delta=1)

将仪表当前值增加delta。如果达到最大值,仪表当前值将反方向倒数

示例:

代码块
Python
自动换行
复制代码
# 模拟不确定进度条。但是这个是实时计算的,所以比较卡
from ttkbootstrap import *
from threading import Thread, main_thread
from time import sleep
root = Window()

# 创建仪表控件,指定样式颜色,不显示文本,且楔形指示器长度40,仪表框架长度50
m = Meter(
    bootstyle=SECONDARY,
    showtext=False,
    wedgesize=40,
    metersize=50
)
m.pack()


def start():
    """开始动画"""
    while True:
        m.amountusedvar.set(m.amountusedvar.get() + 1)
        sleep(0.01)


# 创建线程
t = Thread(target=start, daemon=True)
t.start()

root.mainloop()
复制成功

运行结果:

# 里面的楔形指示器在不停旋转

四十九、ttkbootstrap样式模块

本章对ttkbootstrap包下的style模块进行介绍

在使用from ttkbootstrap import *时,Style类和Bootstyle类会导入到当前命名空间

其他的类请使用以下任意一行语句:

from ttkbootstrap.style import *

import ttkbootstrap.style [as 别名]

from ttkbootstrap.style import 类名[, 类名...]

# StyleBuilderTk和StyleBuilderTTk类由内部使用,这里不过多介绍

(1)、样式类(Style)

1.概念

一个用于创建和管理应用程序主题及控件样式的类,继承自tkinter.ttk.Style

2.构造方法

ttkbootstrap.style.Style(theme=DEFAULT_THEME)

theme——使用的主题名

3.实例只读属性

3.1.colors

当前主题的Colors类的对象

4.方法

4.1.静态方法get_instance()

返回样式类的实例

4.2.load_user_themes(file)

加载以json格式保存的用户主题文件file

4.3.register_theme(definition)

注册主题definition供Style对象使用

definition——ThemeDefinition类的对象

4.4.style_exists_in_theme(ttkstyle)

返回当前主题是否存在样式ttkstyle

 

其他方法见tkinter.ttk.Style类

(2)、bootstyle参数相关类(Bootstyle)

1.概念

Bootstyle类的内容与bootstyle参数相关,方法都为静态方法,这里不过多介绍

(3)、主题定义类(ThemeDefinition)

1.概念

ThemeDefinition类用于为一个ttkbootstrap主题提供名称、颜色和主题类型的类

# 原文是“font settings”,但是内部并没有字体设置相关代码

2.构造方法

ttkbootstrap.style.ThemeDefinition(name, colors, themetype='light&#​39;)

name——指定主题名

colors——指定定义颜色方案的字典,这会将字典中键值对转换为关键字实参传入Colors类的构造方法中

# 如果想要传入Colors类对象c,请使用c.__dict__(前提c没有动态绑定其他属性)

themetype——指定主题类型,值为'light&#​39;或'dark&#​39;

(4)、颜色类(Colors)

1.概念

一个为主题定义颜色方案的类,并提供一些操作颜色的静态方法

一个ThemeDefinition对象会附加一个Colors对象

2.构造方法

ttkbootstrap.style.Colors(primary, secondary, success, info, warning, danger, light, dark, bg, fg, selectbg, selectfg, border, inputfg, inputbg, active)

参数都是指定对应样式颜色的关键字和主题中其他颜色的具体颜色

3.部分方法

# 前面没有标注的是实例方法

3.1.get(color_label)

查询并返回样式颜色的关键字color_label对应十六进制数颜色值

# 也可以通过“颜色对象.关键字”获得颜色值

3.2.set(self, color_label, color_value)

设置样式颜色的关键字color_label的颜色值为color_value

# 也可以通过“颜色对象.关键字 = 值”设置颜色值

3.3.get_foreground(color_label)

返回样式颜色的关键字color_label合适的前景色

# 在内部是如果color_label是light则返回dark的颜色,反之亦然。其他字符串都返回selectfg的颜色

# 下面的rgb颜色值、hsv颜色值都是百分比(从0到1)

3.4.静态方法hex_to_rgb(color)

将十六进制颜色转换为RGB颜色值

3.5.静态方法rgb_to_hex(r, g, b)

将RGB颜色值转换为十六进制颜色

3.6.静态方法rgb_to_hsv(r, g, b)

将RGB颜色值转换为HSV颜色值

3.7.静态方法update_hsv(color, hd=0, sd=0, vd=0)

根据色相变化百分比hd,饱和度变化百分比sd,亮度变化百分比vd调整十六进制颜色color并返回

hd, sd, vd——值表示变化的百分比

示例:

从上到下分别是将hd, sd, vd分别设为0, -0.5, 0.5的success样式颜色

色相从上到下分别约是:44%、22%、66%

饱和度从上到下分别约是:99%、50%、100%

亮度从上到下分别约是:72%、36%、95%

3.8.静态方法label_iter()

返回样式颜色的关键字的迭代器

3.9.静态方法make_transparent(alpha, foreground, background='#​ffffff')

模拟颜色透明

alpha——alpha值,值在0~1之间(透明~不透明)

foreground——前景色,当alpha=1时为此颜色

background——背景色,当alpha=0时为此颜色

(5)、内置主题创建器(TTK Creator)

1.概念

TTK Creator被ttkbootstrap打包,使用TTK Creator可以修改、保存、导出和导入用户自己创建的主题

在安装ttkbootstrap后在cmd中输入命令python -m ttkcreator(或者py -m ttkcreator)使用它

2.演示图

运行时的图片:

3.创建一个新主题

3.1.使用name条目命名主题

3.2.使用base theme条目选择一个基础主题,设置初始颜色

3.3.使用输入控件输入十六进制颜色或使用右边按钮弹出颜色选择对话框选择颜色

3.4.单击Save按钮保存

# 单击Reset按钮重置所有颜色为选择基础主题的颜色

4.导入/导出主题

分别使用Import按钮和Export按钮

文件必须符合以下格式:

5.从JSON文件中导入主题

# 官方文档的中文翻译少了这部分(实际上到后面的内容都没有官方中文翻译)

使用Style.load_user_themes()方法从json格式文件中导入主题

文件格式应如下:

代码块
JavaScript
自动换行
复制代码
{
    "themes": [
        {
            "主题名": {
                "type": "light/dark",
                "colors": {
                    "primary": "十六进制颜色",
                    "secondary": "十六进制颜色",
                    "success": "十六进制颜色",
                    "info": "十六进制颜色",
                    "warning": "十六进制颜色",
                    "danger": "十六进制颜色",
                    "light": "十六进制颜色",
                    "dark": "十六进制颜色",
                    "bg": "十六进制颜色",
                    "fg": "十六进制颜色",
                    "selectbg": "十六进制颜色",
                    "selectfg": "十六进制颜色",
                    "border": "十六进制颜色",
                    "inputfg": "十六进制颜色",
                    "inputbg": "十六进制颜色",
                    "active": "十六进制颜色"
                }
            }
        },
        {
            "重复上个主题定义格式": {}
        }
    ]
}
复制成功

6.使用主题

使用Style.theme_use(主题名)方法使用主题

示例:

打开TTK Creator,将base theme选择为yeti,name设置为red_yeti

将每一种颜色打开颜色对话框,将颜色移到左上,结果图如下:

点击左上角Save按钮保存,这时在程序中输入以下代码就能使用:

from ttkbootstrap import *

root = Window()

 

root.style.theme_use('red_yeti&#​39;)

# 如果要删除该主题,找到ttkbootstrap所在文件夹下的themes文件夹,并将user.py中USER_THEMES字典变量的相应主题删去