文章目录

  • Scale 的数值输入控制
  • Scale 的基本概念
  • Scale 的基本运用
  • 取得与设置Scale 的尺度值
  • 使用 Scale 设置窗口背景颜色
  • askcolor() 方法
  • 容器的应用
  • Spinbox 控件
  • Spinbox 控件基本概念
  • Spinbox 控件基本运用
  • get() 方法的应用
  • 以序列存储 Spinbox的数值数据
  • 非数值数据


Scale 的数值输入控制

Scale 的基本概念

  Scale 可以翻译为尺度。Python的tkinter模块中有 Widget控件Scale,这是一种图形接口输入功能,我们可以移动尺度条产生某一范围的数字

python tk 水平Scrollbar python tkinter scale_Spinbox

建立尺度条的方法是Scale(),它的构造方法如下:

Scale(父对象, options, ...)

参数:

  • 第一个参数:父对象,表示这个尺度条将建立在哪一个窗口内
  • 第二个参数:options,参数如下

参数

含义

activebackground

鼠标光标在尺度条上时的背景颜色

borderwidth

3D边界宽度

默认是两个像素

bd

3D边界宽度

默认是两个像素

bg

背景颜色

command

当使用者更改数值时,会自动执行此方法

cursor

当鼠标光标在尺度条上时的形状

fg

文字前景色彩

font

字形

from_

尺度条范围值的初值

highlightbackground

当尺度条获取焦点时的背景颜色

highlightcolor

当尺度条取得焦点时的颜色

label

如果尺度条是水平的,则此标签出现在左上角,如果尺度条是垂直的,则此标签出现在右上角

默认是没有标签文字

length

默认是100像素

orient

可以设置水平HORIZONTAL或者垂直VERTICAL

默认是水平

relief

可由此更改边界外观

默认是FLAT

repeatdelay

可设置需要按住尺度条多久后才可移动此尺度条

单位是ms

默认是300

resolution

每次更改的数值(相当于每次可以移动的步长)

例如, from_ =2.0, to=4.0,如果将resolution设为0.5,则尺度可能数值是2.0、2.5、3.0、3.5、4.0

showvalue

正常会显示尺度条的目前值,如果设为0则不显示

state

若设置为DISABLED,则暂时无法使用此Scale

takefocus

正常时此尺度条可以循环取得焦点,如果设为0则无法取得焦点

tickinterval

尺度条的标记刻度

例如,from_=2.0,to=3.0, tickinterval=0.25,则刻度是2.0、2.25、2.50、2.75和3.0

to

尺度条范围值的末端值

throughcolor

槽(trough) 的颜色

variable

设置或取得目前选取的尺度值,它的值类型通常是IntVar或StringVar

width

对于垂直尺度条这是槽的宽度,对于水平尺度条这是槽的高度

Scale 的基本运用

例子

import tkinter

root = tkinter.Tk()

scale1 = tkinter.Scale(root, from_=0, to=10).pack()
# length  水平尺度条的宽度
scale2 = tkinter.Scale(root, from_=0, to=10, length=300, orient=tkinter.HORIZONTAL).pack()

root.mainloop()

运行结果:

python tk 水平Scrollbar python tkinter scale_gui_02


例子

import tkinter

root = tkinter.Tk()

scale1 = tkinter.Scale(root,
                       from_=0,                          # 起点值
                       to=10,                            # 终点值
                       troughcolor="lightyellow",        # 槽的颜色
                       width="30",                       # 槽的高度
                       tickinterval=2,                   # 刻度
                       label="刻度尺",                    # 标签
                       length=300,                       # 长度
                       orient=tkinter.HORIZONTAL)         # 水平
scale1.pack()
root.mainloop()

运行结果:

python tk 水平Scrollbar python tkinter scale_Spinbox_03

取得与设置Scale 的尺度值

使用get()方法取得尺度值,使用set()方法设置尺度值

例子

import tkinter

def show():
    print("垂直尺度值 = {}\n水平尺度值 = {}".format(scale1.get(), scale2.get()))
root = tkinter.Tk()

scale1 = tkinter.Scale(root,
                       from_=0,                          # 起点值
                       to=10,                            # 终点值
                       troughcolor="lightyellow",        # 槽的颜色
                       width="20",                       # 槽的高度
                       tickinterval=2,                   # 刻度
                       label="刻度尺",                    # 标签
                       length=200)                      # 长度

scale1.pack()

scale2 = tkinter.Scale(root,
                       from_=0,                          # 起点值
                       to=10,                            # 终点值
                       troughcolor="lightyellow",        # 槽的颜色
                       width="20",                       # 槽的高度
                       tickinterval=2,                   # 刻度
                       label="刻度尺",                    # 标签
                       length=200,                       # 长度
                       orient=tkinter.HORIZONTAL)         # 水平
scale2.pack()
button = tkinter.Button(root, text="cheak this", command=show)
button.pack()
root.mainloop()

运行结果:

python tk 水平Scrollbar python tkinter scale_Scale_04

使用 Scale 设置窗口背景颜色

Scale 控件有一个特点就是在移动时可以自动触发时间

def show():
	pass

scale = Scale(..., command=show)

例子

import tkinter

def show(source):
    # source 用于接收Scale 传回来的参数
    red = rSlider.get()
    green = gSlider.get()
    blue = bSlider.get()
    myColor = "#%02x%02x%02x" % (red, green, blue)   # %02x 转成16进制,字母小写空缺补零
    root.config(bg=myColor)

root = tkinter.Tk()
root.geometry("300x200")

rSlider = tkinter.Scale(root, from_=0, to=255, command=show)
gSlider = tkinter.Scale(root, from_=0, to=255, command=show)
bSlider = tkinter.Scale(root, from_=0, to=255, command=show)

rSlider.grid(row=0, column=0)
gSlider.grid(row=0, column=1)
bSlider.grid(row=0, column=2)
root.mainloop()

运行结果:

python tk 水平Scrollbar python tkinter scale_Spinbox_05

askcolor() 方法

在tkinter 模块内的 colorchooser 模块内有askcolor() 方法,这个方法可以开启色彩对话框,让我们可以很方便的在此对话框中选择我们需要的色彩

例子

import tkinter
from tkinter.colorchooser import *

def colorChoose():
    mycolor = askcolor()
    print(type(mycolor), mycolor)
    root.config(bg=mycolor[1])

root = tkinter.Tk()
root.geometry("300x200")

button = tkinter.Button(root, text="Select Color", command=colorChoose)
button.pack()

root.mainloop()

运行结果:

python tk 水平Scrollbar python tkinter scale_Scale_06


type类型为

<class 'tuple'> ((255.99609375, 128.5, 0.0), '#ff8000')
容器的应用

我们可以使用Frame框架当做容器,将三个色彩尺度条放在此框架内,方便我们去移动或者去管理

例子

import tkinter

def show(source):
    # source 用于接收Scale 传回来的参数
    red = rSlider.get()
    green = gSlider.get()
    blue = bSlider.get()
    myColor = "#%02x%02x%02x" % (red, green, blue)   # %02x 转成16进制,字母小写空缺补零
    root.config(bg=myColor)

root = tkinter.Tk()
root.geometry("300x200")
frame = tkinter.Frame(root)
frame.pack()

rSlider = tkinter.Scale(frame, from_=0, to=255, command=show)
gSlider = tkinter.Scale(frame, from_=0, to=255, command=show)
bSlider = tkinter.Scale(frame, from_=0, to=255, command=show)

rSlider.grid(row=0, column=0)
gSlider.grid(row=0, column=1)
bSlider.grid(row=0, column=2)
root.mainloop()

运行结果:

python tk 水平Scrollbar python tkinter scale_tkinter_07

Spinbox 控件

Spinbox 控件基本概念

  Spinbox 控件也是一种输入控件,其实它是一种Entry和 Button的组合体,他允许用户用鼠标单击up/down按钮,或者是按上箭头/下箭头达到在某一数值区间内增加数值与减少数值的目的。另外,也可以在此直接输入数值

构造方法如下:

Spinbox(父对象, options, ...)

参数:

  • 第一个参数:父对象,表示这个Spinbox将建立在哪一个窗口内
  • 第二个参数:options,参数如下

参数

含义

activebackground

鼠标光标在Spinbox 控件上时的背景颜色

borderwidth

3D边界宽度

默认是两个像素

bd

3D边界宽度

默认是两个像素

bg

背景颜色

command

当使用者更改选项时,会自动执行此方法

cursor

当鼠标光标在Spinbox 控件上时的形状

disablebackground

在Disabled状态时的背景颜色

disableforeground

在Disabled状态时的前景颜色

fg

文字前景色彩

font

字形

format

格式化的字符串

from_

范围值的初值

increment

每次单击up/down按钮的增值或减值的量

justify

在有多行文本时,最后一行的对齐方式

可取值有LEFT/CENTER/RIGHT(靠左/居中/靠右)

默认是居中对齐

relief

可由此更改边界外观

默认是FLAT

repeatdelay

可设置单击up/down按钮变换数字的间隔时间。单位是ms

默认是300

state

若设置为DISABLED,则暂时无法使用此Spinbox

默认是NORMAL,也可以设置READONLY

textvariable

可以设置以变量方式显示

values

可以是元组或其他序列值

to

范围值的末端值

width

对于垂直尺度条这是槽的宽度,对于水平尺度条这是槽的高度

wrap

单击up/down按钮可以让数值重新开始

xscrollcommand

在x轴使用滚动条

Spinbox 控件基本运用

例子

import tkinter

root = tkinter.Tk()
root.geometry("200x80")
spinbox = tkinter.Spinbox(root, from_=10, to=30, increment=2)
spinbox.pack(padx=5, pady=20)

root.mainloop()

运行结果:

python tk 水平Scrollbar python tkinter scale_python_08


备注:如果想要用上箭头/下箭头键更改数值时,需先将插入点放在数值区,也就是输入时闪烁的光标

get() 方法的应用

可以使用get()方法取得目前Spinbox 的值

例子

import tkinter

def printNum():
    print(spinbox.get())

root = tkinter.Tk()
root.geometry("200x80")
spinbox = tkinter.Spinbox(root, from_=10, to=30, command=printNum)
spinbox.pack(padx=5, pady=20)

root.mainloop()

运行结果:

python tk 水平Scrollbar python tkinter scale_gui_09

以序列存储 Spinbox的数值数据

其实在使用 Spinbox 时也可以不设置初值和终值, 而是将数值存储在序列数据中。

例如,元组或列表内,当单击上箭头/下箭头按钮时,相当于是观察元组或列表内索引(index)内的值

例子

import tkinter

def printNum():
    print(spinbox.get())

root = tkinter.Tk()
root.geometry("200x80")
spinbox = tkinter.Spinbox(root, values=(1, 3, 5, 7, 9), command=printNum)
spinbox.pack(padx=5, pady=20)

root.mainloop()

运行结果:

python tk 水平Scrollbar python tkinter scale_python_10


因为元组内容是(1, 3, 5, 7, 9),所以程序启动后出现的值是1,第1次单击按钮时的值是3, 第2次单击按钮时的值是5

非数值数据

可以使用列表或元组存储序列资料,其实应用在Spinbox内可以是数值数据也可以是非数值数据,例如,字符串

例子

import tkinter


def printNum():
    print(spinbox.get())


foods = ("饺子", "汤圆", "春卷", "油条", "面窝", "热干面")

root = tkinter.Tk()
root.geometry("200x80")
spinbox = tkinter.Spinbox(root, values=foods, command=printNum)
spinbox.pack(padx=5, pady=20)

root.mainloop()

运行结果:

python tk 水平Scrollbar python tkinter scale_tkinter_11

谢谢观看,笔者会持续更新,如有错误或者建议,请私信我