【tkinter系列 第七课 Scale部件 】
python中通常我们写程序,显示结果和操作都是在终端区,如果要想实现一个有显示界面的程序那该怎样实现呢?python中有好几个库都可以实现,这个系列我们一起来学习如何使用python自带的tkinter库来实现。
本节课将要学习Scale窗口部件,Scale是范围的意思,这个部件可以叫做尺度条或者拉动条,那什么时候该用Scale部件呢?通常是在当你需要使用滑块来控制某个数值时,这个就非常方便,这个控件解决了用户一个问题,用户不需要去判断输入的内容是否合规问题,在控件上直接滑动滑块就可以了。
显示控件
代码:
from tkinter import *
import tkinter.messagebox
#创建一个主窗口
root = Tk()
# 创建 宽400高250的窗口 x是小写的英文字符
root.geometry('400x250')
# 创建scale部件1
w = Scale(root, from_=0, to=100)
w.pack()
# 创建scale部件2
w = Scale(root,
from_=0, # 起始值
to=200, # 结束值
tickinterval=40, # 刻度值 每隔40显示一个值,实际会受步距值影响
sliderlength=20, # 滑块按钮的长度
length=250, # scale部件的外观长度
resolution=20, # 步距值 移动滑块一次数值改变20
orient=HORIZONTAL, # 水平放置控件
w.pack()
# 程序一直循环,直到我们关闭窗口
root.mainloop()
效果:
功能实现
接下来实现一个小案例,通过控制两个scale部件,实现对label的字体大小和内容的改变。
第一步:部件布局
代码:
from tkinter import *
import tkinter.messagebox
#创建一个主窗口
root = Tk()
# 创建 宽400高250的窗口 x是小写的英文字符
root.geometry('400x250')
# 设置背景为red,字体为Arial,大小为16
l=Label(root,text="原始值:0",bg="red",font=('Arial',16))
l.pack()
w1 = Scale(root,
from_=10, # 起始值
to=50, # 结束值
tickinterval=10, # 刻度值 每隔10显示一个值,实际会受步距值影响
sliderlength=20, # 滑块按钮的长度
length=200, # scale部件的外观长度
resolution=10, # 步距值 移动滑块一次数值改变10
orient=HORIZONTAL,# 水平放置控件
w1.pack()
# 程序一直循环,直到我们关闭窗口
root.mainloop()
效果:
第二步:给控件添加一个方法
代码:
from tkinter import *
import tkinter.messagebox
#创建一个主窗口
root = Tk()
# 创建 宽400高250的窗口 x是小写的英文字符
root.geometry('400x250')
# 添加一个改变标签内容的方法
# 当scale控件滑块变化,会传入一个v变量,名字可以随便取
def change_label(v):
l.config(text="当前数值:"+ v)
# 设置背景为red,字体为Arial,大小为16
l=Label(root,text="原始值:0",bg="red",font=('Arial',16))
l.pack()
w1 = Scale(root,
from_=10, # 起始值
to=50, # 结束值
tickinterval=10, # 刻度值 每隔10显示一个值,实际会受步距值影响
sliderlength=20, # 滑块按钮的长度
length=200, # scale部件的外观长度
resolution=10, # 步距值 移动滑块一次数值改变10
orient=HORIZONTAL,# 水平放置控件
command=change_label #绑定一个方法
w1.pack()
# 程序一直循环,直到我们关闭窗口
root.mainloop()
效果:
解释:
这里代码添加了一个方法,同时给scale设置了一个command的属性,绑定了这个方法;这里在绑定方法时可能会有疑问,为啥么绑定的时候并没有传入参数,但是实际的函数却又有参数。
实际上Scale部件当绑定方法时是会默认将当前的 刻度值传递到函数里面去的,并且它的数据类型是字符类型的,具体可以使用type来打印查看一下。
拓展知识:
这里除了使用上面的方法,还可以用下面的方法,scale控件还有一个get的方法,可以获取当前控件的一个值,使用这个方法,原来的变量就可以不使用了,但是变量不能删除,函数格式要求是要传入变量的。
同时要注意这种方法获取的是数字类型,所以设置文本值时还需要使用str将类型进行转换。
第三步:改变文字大小
代码:
from tkinter import *
import tkinter.messagebox
#创建一个主窗口
root = Tk()
# 创建 宽400高250的窗口 x是小写的英文字符
root.geometry('400x250')
def change_label(v):
value=w1.get()
font_size=w2.get()
l.config(text="当前数值:" + str(value),font=('Arial',font_size))
# 设置背景为red,字体为Arial,大小为16
l=Label(root,text="原始值:0",bg="red",font=('Arial',16))
l.pack()
w1 = Scale(root,
label="设置内容",# 给控件设置标签内容
from_=10, # 起始值
to=50, # 结束值
tickinterval=10, # 刻度值 每隔10显示一个值,实际会受步距值影响
sliderlength=20, # 滑块按钮的长度
length=200, # scale部件的外观长度
resolution=10, # 步距值 移动滑块一次数值改变10
orient=HORIZONTAL,# 水平放置控件
command=change_label
w1.pack()
w2 = Scale(root,
label="设置字体大小", # 给控件设置标签内容
from_=10, # 起始值
to=30, # 结束值
length=200, # scale部件的外观长度
orient=HORIZONTAL, # 水平放置控件
command=change_label
w2.pack()
# 程序一直循环,直到我们关闭窗口
root.mainloop()
效果:
解释:
这里新增了一个scale控件,同时给两个控件都加上了一个label属性,让我们清晰每一个控件的作用。
这里为了方便直接调用了同一个方法,一个改变内容,一个改变大小,这里可以看到我用的都是get的方法,因为通过这个方法可以区分开两个控件的变量;
但是还是有一个问题,大小和内容是用一个config方法配置的,所以不管先改变哪一个控件,标签的内容或者大小都会变成当前控件的初始值。
第四步:完善代码
要想比较完美一点,可以分开写两个方法。
代码:
from tkinter import *
import tkinter.messagebox
#创建一个主窗口
root = Tk()
# 创建 宽400高250的窗口 x是小写的英文字符
root.geometry('400x250')
def change_text(v):
l.config(text="当前数值:" + v)
def change_font_size(v):
l.config(font=('Arial', int(v)))
# 设置背景为red,字体为Arial,大小为16
l=Label(root,text="原始值:0",bg="red",font=('Arial',16))
l.pack()
w1 = Scale(root,
label="设置内容",# 给控件设置标签内容
from_=10, # 起始值
to=50, # 结束值
tickinterval=10, # 刻度值 每隔10显示一个值,实际会受步距值影响
sliderlength=20, # 滑块按钮的长度
length=200, # scale部件的外观长度
resolution=10, # 步距值 移动滑块一次数值改变10
orient=HORIZONTAL,# 水平放置控件
command=change_text
w1.pack()
w2 = Scale(root,
label="设置字体大小", # 给控件设置标签内容
from_=10, # 起始值
to=30, # 结束值
length=200, # scale部件的外观长度
orient=HORIZONTAL, # 水平放置控件
command=change_font_size