Scale的基本概念
Scale可以翻译为尺度。Python的tkinter模块中有Widget控件Scale,这是一种图形输入功能,
我们可以移动尺度条产生某一范围的数字。
建立尺度条的方法是Scale(),它的构造方法如下。
Scale(父对象,options,···)
Scale()方法的第一个参数是父对象,表示这个尺度条将建立在哪一个父对象内。下列是Scale方法内
其他常用的options参数。
(1)activebackground:鼠标光标在尺度条上时的背景颜色。
(2)bg:背景颜色。
(3)borderwidth或bd:3D边界宽度默认是两个像素。
(4)command:当使用者更改数值时,会自动执行此函数。
(5)cursor:当鼠标光标在尺度上时的光标形状。
(6)digits:尺度数值,读取时需使用IntVar、DoubleVar或StringVar变量类型读取。
(7)fg:文字前景颜色
(8)font:字形
(9)from_:尺度条范围值的初值。
(10)hightlightbackground:当尺度条取得焦点时的背景颜色。
(11)hightlightcolor:当尺度条获得焦点时的颜色。
(12)label:默认是没有标签文字,如果尺度条是水平的则此标签出现在左上角,如果尺度条是
垂直的则此标签出现在右上角。
(13)length:默认是100像素。
(14)orient:默认是水平,可以设置水平HORIZONTAL或垂直VERTICAL。
(15)relief:默认是FLAT,可由此更改边界外观。
(16)repeatdelay:可设置需要按住尺度条多久后才可移动此尺度条,单位是ms,默认是300。
(17)resolution:每次更改的数值,例如,from_=2.0,to=4.0,如果将resolution设为0.5,
则尺度可能数值是2.0、2.5、3.0、3.5、4.0。
(18)showvalue:正常会显示尺度条的目前值,如果设为0则无法取得焦点。
(19)state:如果设为DISABLE则暂时无法使用此Scale。
(20)takefocus:正常时此尺度条可以循环取得焦点,如果设为0则无法取得焦点。
(21)tickinterval:尺度条的标记刻度,例如,from_=2.0,to=3.0,tickinterval=0.25,此
刻度是2.0、2.25、2.50、2.75和3.0。
(22)to:尺度条范围值的末端值。
(23)troughcolor:槽(trough)的颜色。
(24)variable:设置或取得目前选取的尺度值,它的值类型通常是IntVar或StringVar。
(25)width:对于垂直尺度条这是槽的宽度,对于水平尺度条这是槽的高度。
样例:一个水平尺度条与垂直尺度条的应用。尺度值的范围为010,垂直的范围为010,
垂直尺度条使用默认长度,水平尺度条则设为300。
from tkinter import *
window=Tk()
window.title("ch9_1")
slider1=Scale(window,from_=0,to=10).pack()
slider2=Scale(window,from_=0,to=10,
length=300,orient=HORIZONTAL).pack()
window.mainloop()
示例二:设置Scale()构造方法中的多个参数。
from tkinter import *
root=Tk()
root.title("ch9_2")
slider=Scale(root,
from_=0,
to=10,
troughcolor="yellow",
width="30",
tickinterval=2,
label="My Scale",
length=300,
orient=HORIZONTAL)
slider.pack()
root.mainloop()
取得与设置Scale的尺度值
设计GUI程序时可以使用set()方法设置尺度的值,可以使用get()方法取得尺度的值。
实例:使用set()设置尺度初值,使用get()获得尺度值。当单击Print按钮时可以在Python Shell窗口中
列出垂直和水平的尺度值。
from tkinter import *
def printInfo():
print("垂直尺度值=%d,水平尺度值=%d" % (sV.get(),sH.get()))
root=Tk()
root.title("ch9_3")
sV=Scale(root,label="垂直",from_=0,to=10)
sV.set(5)
sV.pack()
sH=Scale(root,label="水平",from_=0,to=10,
length=300,orient=HORIZONTAL)
sH.set(3)
sH.pack()
Button(root,text="Print",command=printInfo).pack()
root.mainloop()
使用Scale设置窗口背景颜色
Scale控件有一个特点是在移动时可以自动触发事件。我们可以在使用Scale()时增加command
参数设置移动时所要执行的callback方法。
def callback():
·
·
·sliderObj=Scale(···,command=callback)
从上述可知,当有尺度条时会调用与执行callback()方法。
样例:设计三个尺度条分别代表R、G、B三种颜色,当移动这三个尺度条时,Python Shell将
显示这三个尺度条的颜色值,通知可以看到窗口背景颜色也将实时更改。
from tkinter import *
def bgUpdate(source):
red=rSlider.get()
green=gSlider.get()
blue=bSlider.get()
print("R=%d,G=%d,B=%d" % (red,green,blue))
myColor="#%02x%02x%02x" % (red,green,blue)
root.config(bg=myColor)
root=Tk()
root.title("ch9_4")
root.geometry("360x240")
rSlider=Scale(root,from_=0,to=255,command=bgUpdate)
gSlider=Scale(root,from_=0,to=255,command=bgUpdate)
bSlider=Scale(root,from_=0,to=255,command=bgUpdate)
gSlider.set(125)
rSlider.grid(row=0,column=0)
gSlider.grid(row=0,column=1)
bSlider.grid(row=0,column=2)
root.mainloop()
上述设计是将尺度条放置在窗口左上角,如果想调整位置并不方便,最好的设计方式是先设计一个容器,
然后将这三个尺度条放置在此容器内,未来如果想要移动位置,可以直接移动容器位置。
askcolor()方法
在tkinter模块内的colorchooser模块内有askcolor()方法,这个方法可以开启"色彩"对话框,我们可以很方便
地在此对话框中选择色彩。
样例:使用开启"色彩"对话框
from tkinter import *
from tkinter.colorchooser import *
def bgUpdate():
myColor=askcolor()
print(type(myColor),myColor)
root.config(bg=myColor[1])
root=Tk()
root.title("ch9_4——1")
root.geometry("360x240")
btn=Button(text="Select Color",command=bgUpdate)
btn.pack(pady=5)
root.mainloop()。
myColor的数据类型是元组,这个元组中有两个元素,索引0的元素也是元组,这个元素中含有
三个数据,分别是RGB的色彩值。索引1的元素是16位的色彩字符串。我们可以使用色彩字符串
设置窗口的背景颜色。
容器的应用
样例:将三个色彩尺度条放置在Frame容器内,然后将Frame容器放置在窗口上方中央。
from tkinter import *
def bgUpdate(source):
red=rSlider.get()
green=gSlider.get()
blue=bSlider.get()
print("R=%d,G=%d,B=%d" % (red,green,blue))
myColor="#%02x%02x%02x" % (red,green,blue)
root.config(bg=myColor)
root=Tk()
root.title("ch9_5")
root.geometry("360x240")
fm=Frame(root)
fm.pack()
rSlider=Scale(fm,from_=0,to=255,command=bgUpdate)
gSlider=Scale(fm,from_=0,to=255,command=bgUpdate)
bSlider=Scale(fm,from_=0,to=255,command=bgUpdate)
gSlider.set(125)
rSlider.grid(row=0,column=0)
gSlider.grid(row=0,column=1)
bSlider.grid(row=0,column=2)
root.mainloop()
网友评论