'''Tkinter教程之Spinbox篇'''
# 与Entry类似,但可以指定输入范围值
'''1.创建一个Spinbox'''
from tkinter import *

root = Tk()
Spinbox(root).pack()
'''2.设置Spinbox的最大、最小值和步距值'''
Spinbox(root,
        from_=0,  # 设置最小值
        to=100,  # 设置最大值
        increment=5  # 设置增量值为5,这个与Scale的resolution意思相同
        ).pack()
root.mainloop()
# 只是创建了一个Spinbox,其它的什么也做不了,与Scale不同,Scale使用缺省值就可以控制 值的改变。



'''3.设置Spinbox的值,设置属性values,设置此值后,每次更新值将使用values指定的值,'''
# -*- coding: utf-8 -*-
from tkinter import *

root = Tk()
sb = Spinbox(root,
             values=(0, 2, 20, 40, -1),
             increment=2
             )
sb.pack()
# 打印当前的Spinbox的值,为一tuple
print(sb['values'])

# 显示的第一个值为0,up按钮则为2,20,40,-1,不再是增2操作,它会使用tuple的索引递增,至到tuple的最后一个项时,将不再增加;
# down按钮与up按钮恰好相反,它使用tuple的索引递减

'''4.Spinbox绑定变量 '''
v = StringVar()
sb = Spinbox(root,
             values = (0,2,20,40,-1),
             increment = 2,
             textvariable = v
             )
v.set(20)
print(v.get())
sb.pack()
#上面的代码将变量v与sb绑定,并将Spinbox的初始值设置为20,运行程序,Spinbox的值显示为20,再点击up按钮,此时值变为40,
#即tuple的下一个值,再看下面的代码,与这个不同的是设置的值不包含在tuple之内
v = StringVar()
sb = Spinbox(root,
             values = (0,2,20,40,-1),
             increment = 2,
             textvariable = v
             )
v.set(200)
print(v.get())
sb.pack()
#运行程序,显示的值为200,再次点击up按钮,显示的值为2,即虽然Spinbox能将值显示出来,但并不会将200添加到变量中,此时的
#索引值依旧为0,因为没有找到200的项。当点击up时,索引值变为1,即显示的值为2。
root.mainloop()



'''5.设置Spinbox的回调函数'''
from tkinter import *

root = Tk()


def printSpin():
    print(sb.get())
    # 使用get()方法来得到当前的显示值

sb = Spinbox(root,
             from_=0,  # 最小值
             to=10,  # 最大值
             command=printSpin  # 回调函数
             )

sb.pack()
root.mainloop()
# 每次点击Spinbox按钮时就会调用printSpin函数,打印出'Spinbox'。与Scale不同的是:它不需要参数。



'''7.删除Spinbox指定位置的字符'''
#delete函数
# -*- coding: utf-8 -*-
from tkinter import *

root = Tk()


def printSpin():
    print(sb.get())


sb = Spinbox(root,
             from_=1234,  # 最小值
             to=9999,  # 最大值
             increment=1,
             command=printSpin  # 回调函数
             )
sb.delete(0)
print(sb.get())
sb.pack()
root.mainloop()



'''8.在Spinbox指定位置插入文本'''
# 在每项后面添加.00表示精度,同样使用回调函数实现,代码如下:
# -*- coding: utf-8 -*-
from tkinter import *

root = Tk()


def printSpin():
    # 使用get()方法来得到当前的显示值
    sb.insert(END, '.00')
    print(sb.get())


sb = Spinbox(root,
             from_=1234,  # 最小值
             to=9999,  # 最大值
             increment=1,
             command=printSpin  # 回调函数
             )
sb.pack()
root.mainloop()
# 每次点击Spinbox按钮时就会调用printSpin函数,当前的显示值均添加了两个有数字".00"。这个与delete不同,倒是可以正确显示。