3-ttk组件介绍

2023-10-08 17:40
文章标签 组件 介绍 ttk

本文主要是介绍3-ttk组件介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ttk组件

ttk模块里除前面的12个组件:Button,Lable,Frame,LabelFrame,Radiobutton,Checkbutton,Entry,Menu,PaneWindow,Scale,Spinbox,Scrollbar 还增加了6个ttk独有的组件:Combobox,Notebook,Progressbar,Separator,Sizegrip,Treeview

ttk组件在外观样式上是跟系统相统一的主题,在外观上好看了

注意,ttk在外观样式的设置上,跟tkinter模块的组件有些不一样,它可以靠ttk的style类来实现,作为后续的ttk模块对tkinter的兼容性并不好,比如,设置背景颜色bg,前景颜色fg,就不可以用了。

简单对比

import tkinter as tk
import tkinter.ttk as ttkroot=tk.Tk()fr1=tk.LabelFrame(root,text='tk.LableFrame') # 不设置边线宽,无法显示
fr1.pack(padx=10,pady=10)
fr2=ttk.LabelFrame(root,text='ttk.LableFrame') # 不设置边线宽,无法显示
fr2.pack(padx=10,pady=10)but1=tk.Button(fr1,text="按钮1")
but1.pack(side='left',padx=10,pady=10)but2=ttk.Button(fr2,text="按钮2")
but2.pack(side='left',padx=10,pady=10)la1=tk.Label(fr1,text='标签1',bg='lightblue')
la1.pack(side='left',padx=10,pady=10)la2=ttk.Label(fr2,text='标签2',background='lightblue')
la2.pack(side='left',padx=10,pady=10)var1=tk.IntVar()
ra1=tk.Radiobutton(fr1,text='单选按钮1',variable=var1,value=1)
ra1.pack(side='left',padx=10,pady=10)ra2=ttk.Radiobutton(fr2,text='单选按钮2',variable=var1,value=2)
ra2.pack(side='left',padx=10,pady=10)var2=tk.IntVar()
ch1=tk.Checkbutton(fr1,text="多选按钮1",variable=var1)
ch1.pack(side='left',padx=10,pady=10)var3=tk.IntVar()
ch2=ttk.Checkbutton(fr2,text="多选按钮1",variable=var3)
ch2.pack(side='left',padx=10,pady=10)sca1=tk.Scale(fr1,from_=0,to=255,orient=tk.HORIZONTAL)
sca1.pack(side='left',padx=10,pady=10)sca2=ttk.Scale(fr2,from_=0,to=255,orient=tk.HORIZONTAL)
sca2.pack(side='left',padx=10,pady=10)root.mainloop()

1.PNG

除了标签外,其它组件在风格上还是有明显的不同,ttk风格的确跟系统的主题更统一

在tkinter的背景颜色设置上,用bg和用background都是可以的,但是,在ttk里是不支持bg,fg。需要替换成

查看ttk组件支持参数

在创建la1,la2完以后,在代码加入

print(la1.keys())
print('----------------------')
print(la2.keys())"""
['activebackground', 'activeforeground', 'anchor', 'background', 'bd', 'bg', 'bitmap', 'borderwidth', 'compound', 'cursor', 'disabledforeground', 'fg', 'font', 'foreground', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'image', 'justify', 'padx', 'pady', 'relief', 'state', 'takefocus', 'text', 'textvariable', 'underline', 'width', 'wraplength']----------------------['background', 'foreground', 'font', 'borderwidth', 'relief', 'anchor', 'justify', 'wraplength', 'takefocus', 'text', 'textvariable', 'underline', 'width', 'image', 'compound', 'padding', 'state', 'cursor', 'style', 'class']
"""

style()方法,设置

ttk组件可以通过sytle对象来设置组件的外观

from tkinter import *
from tkinter.ttk import *root=Tk()but1=Button(root,text="wb98.com",background='blue',foreground='red',font=('黑体',12,'bold'))
but1.pack()root.mainloop()

以上代码想在窗体创建一个按钮,设置按钮的背景颜色为红色,前景颜色为红色,字体为黑体,但是,运行后,出错了。

上面代码导入tkinter,ttk的通配符方式,决定ttk模块的组件会覆盖掉tkinter模块下的同名组件,所以,在上面代码应该按照ttk设置组件外观样式的方法,而不要沿用以前的方法 ,ttk模块设置方法是用style对象。

Style对象创建方法:

对象名=Style()

style1=Style()s2=Style()wb98=Style()
Style对象设置方法:

对象实例.configure('ttk样式名', 样式参数......)

style1.configure('TButton', background='blue',foreground='red')
s2.configure('my.TButton', background='blue',foreground='red')
wb98.configure('.', background='blue',foreground='red')
ttk样式名

ttk样式名是有强制规定

为所有组件设置,系统已经强制ttk样式名为'.'

如:Style对象名. configure('.', background='blue',foreground='red')

为某类组件设置,系统也有强制ttk样式名:

大部分样式名都在组件类名的前面加大写的T

组件类ttk样式名
ButtonTButton
CheckbuttonTCheckbutton
RadiobuttonTRadiobutton
EntryTEntry
ComboboxTCombobox
FrameTFrame
LabelTLabel
LabelFrameTLabelFrame
NotebookTNtebook
MenubuttonTMenubutton
PanedWindowTPandwindow ( 不是TpandWindow )
ProgressbarHorizontal.TProgressbar Vertical.TProgressbar
ScaleHorizontal.TScale Vertical.TScale
ScrollbarHorizontal.TScrollbar Vertical.TScrollbar
SizegripTSizegrip
SeparatorTSeparator
TreeviewTreeview ( 不是 TTreeview )

如:Style对象名. configure('TButton', background='blue',foreground='red')

设置成功后,窗体上所有的按钮都被设置成蓝色背景色,红色前景色,其它的组件,如标签,单选按钮等是不会接受影响的。

为窗体上某一个单独的组件设置,其它同类的组件不受影响,你需要为这个单独设置的组件起一个样式名,样式名的格式是:自取的名字.组件类的强制名。

为窗体上某一个单独的组件设置

其它同类的组件不受影响,你需要为这个单独设置的组件起一个样式名,样式名的格式是:自取的名字.组件类的强制名。

如:我的一个按钮取样式名:my.TButton

我的一个标签取样式名:wb86.TLabel

例子

结合上面,建立一个窗体,窗体上有3个组件,2个按钮,一个标签,我先为所有窗体上的组件进行设置,然后为窗体所有的按钮进行设置,再后,我只为其中的一个按钮进行设置。

from tkinter import *
from tkinter.ttk import *root=Tk()but1=Button(root,text="我是按钮1")
but1.pack(padx=60,pady=10)but2=Button(root,text="我是按钮2")
but2.pack(padx=60,pady=10)la1=Label(root,text='我是标签')
la1.pack(padx=60,pady=10)root.mainloop()

2.PNG

让所有的组件的样式都变一下,在组件创建前加入style样式代码。

运行后,由于设置的样式名是:’.’ ,所以窗体上的三个组件,不管是按钮还是标签的外观样式都改变了。

from tkinter import *
from tkinter.ttk import *root=Tk()style1 = Style() # 创建Style对象,便于下面设置样式
style1.configure('.',background='blue',foreground='red',font=('黑体',12))
#设置背景颜色为蓝色,前景颜色为红色,'.'为所有组件的样式名but1=Button(root,text="我是按钮1")
but1.pack(padx=60,pady=10)but2=Button(root,text="我是按钮2")
but2.pack(padx=60,pady=10)la1=Label(root,text='我是标签')
la1.pack(padx=60,pady=10)root.mainloop()

3.PNG

下面只改变按钮样式,不改变标签的样式:

由于只设置了按钮的样式(’TButton’),所以只有2个按钮的外观样式有了变化,标签还是默认的样子。

from tkinter import *
from tkinter.ttk import *root=Tk()style1 = Style() # 创建Style对象,便于下面设置样式
style1.configure('TButton',background='blue',foreground='red',font=('黑体',12))
#设置背景颜色为蓝色,前景颜色为红色,'TButton'为所有按钮组件的样式名but1=Button(root,text="我是按钮1")
but1.pack(padx=60,pady=10)but2=Button(root,text="我是按钮2")
but2.pack(padx=60,pady=10)la1=Label(root,text='我是标签')
la1.pack(padx=60,pady=10)root.mainloop()

4.PNG

只改变第1个按钮的样式,由于只是改变某个组件类的部分组件,这时,就需要为这个样式取一个自定义的名字:my.TButton

2个按钮中,只有按钮1样式有变化,另一个按钮是默认的样式,标签也是默认的样式。

from tkinter import *
from tkinter.ttk import *root=Tk()style1 = Style() # 创建Style对象,便于下面设置样式
style1.configure('my.TButton',background='blue',foreground='red',font=('黑体',12))
#设置背景颜色为蓝色,前景颜色为红色,'my.TButton'为部分按钮组件的样式名but1=Button(root,text="我是按钮1",style='my.TButton')
but1.pack(padx=60,pady=10)but2=Button(root,text="我是按钮2")
but2.pack(padx=60,pady=10)la1=Label(root,text='我是标签')
la1.pack(padx=60,pady=10)root.mainloop()

5.PNG

Style对象设置时,在样式名是自定义 my.TButton ,另一方面,在要设置按钮的创建代码中,一定要加一个参数 style=‘my.TButton’ ,这2地方的变动缺一不可,否则不能成功。

主题theme

说明

各种风格统一的样式组件在一起,就组成了主题,ttk自带有几个主题,不同的电脑系统支持不同的主题,

来列出自己电脑系统支持的tkinter所有的主题。

from tkinter import *
from tkinter.ttk import *root=Tk()style1 = Style() # 创建Style对象,便于下面设置样式
print(style1.theme_names()) # 输出本机ttk所有主题风格
print(style1.theme_use()) # 输出现在采用的那种主题root.mainloop()

运行后,输入结果:(电脑系统是window10)

(‘winnative’, ‘clam’, ‘alt’, ‘default’, ‘classic’, ‘vista’, ‘xpnative’)

采取某款ttk主题

用tkinter模块是不方便做程序的美化工作,导入ttk模块后,我们利用ttk模块支持的主题,做一个换肤程序就容易了。下面我们就来做一个换肤程序吧。

采取某款ttk主题的方法是: style1.theme_use(‘主题名’)

from tkinter import *
from tkinter.ttk import *root=Tk()  # 源码来自wb98.comroot.columnconfigure(0,weight=1,minsize=150) # 0列 限制最小宽度为150像素
root.columnconfigure(1,weight=1,minsize=150) # 1列 限制最小宽度为150像素fr1=Frame(root) # fr1是作为窗体的底色而创建的
fr1.place(x=0,y=0,relwidth=1,relheight=1) # 参数保证fr1跟窗体一样大小style1 = Style() # 创建Style对象,便于下面设置样式tuple_op=style1.theme_names() # 返回值是本机ttk所有主题风格的元组
var=StringVar()def changejob(cs): # 参数正好就是选择项的文本style1.theme_use(cs)op1=OptionMenu(root,var,*tuple_op,command=changejob) # 用下拉列表组件来选择主题
op1.grid()
var.set(style1.theme_use()) # 组件默认选项设为目前的主题lfr1=LabelFrame(root,text='单选') # 装入3个单选按钮
lfr1.grid(row=1,column=0,sticky='nswe',padx=10,pady=10)var1=IntVar()
ra1=Radiobutton(lfr1,text='苹果',variable=var1,value=1).pack()
ra1=Radiobutton(lfr1,text='西瓜',variable=var1,value=2).pack()
ra1=Radiobutton(lfr1,text='葡萄',variable=var1,value=3).pack()
var1.set(1)lfr2=LabelFrame(root,text='多选') # 装入3个多选按钮
lfr2.grid(row=1,column=1,sticky='nswe',padx=10,pady=10)
var2,var3,var4=IntVar(),IntVar(),IntVar()
ch1=Checkbutton(lfr2,text="足球",variable=var2).pack()
ch2=Checkbutton(lfr2,text="田径",variable=var3).pack()
ch3=Checkbutton(lfr2,text="游泳",variable=var4).pack()
var3.set(True)
var4.set(True)fr1=Frame(root) # 框架装入2个按钮
fr1.grid(row=2,column=0,columnspan=2,sticky=W+E,pady=(0,10))but1=Button(fr1,text=" 退 出 ",command=root.destroy)
but1.pack(side=RIGHT,padx=(10,30))
but2=Button(fr1,text=" 确 定 ")
but2.pack(side=RIGHT)root.mainloop()

img

img

img

img

img

上述都是用官方提供的主题包,加载速度不错,样式也还行。

第三方的主题包,由于是以图片的形式来做主题包,加载速度在启动时,慢了好几秒.tkinter做为解释性语言本来就慢了,只是为了好看的界面而降低反映速度太多,本末倒置了。

这篇关于3-ttk组件介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/166928

相关文章

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数