Tkinter教程之Spinbox篇


'''Tkinter教程之Spinbox篇'''
#与Entry类似,但可以指定输入范围值
'''1.创建一个Spinbox'''
from Tkinter import *
root = Tk()
Spinbox(root).pack()
root.mainloop()
#只是创建了一个Spinbox,其它的什么也做不了,与Scale不同,Scale使用缺省值就可以控制 值的改变。
'''2.设置Spinbox的最大、最小值和步距值'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
Spinbox(root,
        from_ = 0,      #设置最小值
        to = 100,       #设置最大值
        increment = 5   #设置增量值为5,这个与Scale的resolution意思相同
        ).pack()
root.mainloop()
'''3.设置Spinbox的值,设置属性values,设置此值后,每次更新值将使用values指定的值,'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
sb = Spinbox(root,
             values = (0,2,20,40,-1),
             increment = 2
             )
sb.pack()
# 打印当前的Spinbox的值,为一tuple
print sb['values']
root.mainloop()
#显示的第一个值为0,up按钮则为2,20,40,-1,不再是增2操作,它会使用tuple的索引递增,至到tuple的最后一个项时,将不再增加;
#down按钮与up按钮恰好相反,它使用tuple的索引递减
'''4.Spinbox绑定变量 '''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
v = StringVar()
sb = Spinbox(root,
             values = (0,2,20,40,-1),
             increment = 2,
             textvariable = v
             )
v.set(20)
print v.get()
sb.pack()
# 打印当前的Spinbox的值,为一tuple
root.mainloop()
#上面的代码将变量v与sb绑定,并将Spinbox的初始值设置为20,运行程序,Spinbox的值显示为20,再点击up按钮,此时值变为40,
#即tuple的下一个值,再看下面的代码,与这个不同的是设置的值不包含在tuple之内
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
v = StringVar()
sb = Spinbox(root,
             values = (0,2,20,40,-1),
             increment = 2,
             textvariable = v
             )
v.set(200)
print v.get()
sb.pack()
# 打印当前的Spinbox的值,为一tuple
root.mainloop()
#运行程序,显示的值为200,再次点击up按钮,显示的值为2,即虽然Spinbox能将值显示出来,但并不会将200添加到变量中,此时的
#索引值依旧为0,因为没有找到200的项。当点击up时,索引值变为1,即显示的值为2。
'''5.设置Spinbox的回调函数'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
def printSpin():
    print 'Spinbox'
sb = Spinbox(root,      
             from_ = 0,         #最小值
             to = 10,           #最大值
             command = printSpin#回调函数
             )
sb.pack()
root.mainloop()
#每次点击Spinbox按钮时就会调用printSpin函数,打印出'Spinbox'。与Scale不同的是:它不需要参数。
'''6.打印Spinbox的当前内容,是显示的值,不是values的值。'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
def printSpin():
    # 使用get()方法来得到当前的显示值
    print sb.get()
sb = Spinbox(root,      
             from_ = 0,         #最小值
             to = 10,           #最大值
             command = printSpin#回调函数
             )
sb.pack()
root.mainloop()
#每次点击Spinbox按钮时就会调用printSpin函数,打印出Spinbox的当前值。
'''7.删除Spinbox指定位置的字符(这是个有问题的程序)'''
#在回调函数中使用delete,Spinbox初始值为1234,点击up一次Spinbox的值变为235,再次点击变为36,再次点击变为7,但实际执行结果
#为第一次点击235,再次点击为234,以后所有的点击操作均为此值。不知为何。
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
def printSpin():
    sb.delete(0)
    print sb.get()

sb = Spinbox(root,      
             from_ = 1234,         #最小值
             to = 9999,           #最大值
             increment = 1,
             command = printSpin#回调函数
             )
sb.pack()
root.mainloop()
# 如果不使用回调函数,两次调用delete则可以正常,工作如下代码:
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()

sb = Spinbox(root,      
             from_ = 1234,      #最小值
             to = 9999,         #最大值
             increment = 1
             )
sb.delete(0)
sb.delete(0)
print sb.get()
sb.pack()
root.mainloop()
#此程序正常,可以打印出正确结果'34'
'''关于delete回调函数异常问题,又使用如下代码作了实验'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
def printSpin():
    # 使用delete()方法删除指定索引的字符
    sb.delete(0)
    print sb.get()
sb = Spinbox(root,
             values = (1234,234,34,4),
             command = printSpin
             )
sb.pack()
root.mainloop()
#则这个程序点击up可以打印出34,再次点击则为空。
'''
这个是可以工作的:①当前的值为1234,②点击up按钮时,程序调用回调函数printSpin将Spinbox的当
前值变为234;③Spinbox查找值为234的项,得到索引为1,即当前的索引值变为1,up还会将索引增1,即变为2,所有显示的值
为34,为了更好理解,用如下代码再次测试:
'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
def printSpin():
    # 使用delete()方法删除指定索引的字符
    sb.delete(0)
    print sb.get()
sb = Spinbox(root,
             values = (1234567890,234567890,34567890,4567890,567890,
                       67890,7890,890,90,0),
             command = printSpin    #回调函数
             )
sb.pack()
root.mainloop()
#这个程序显示的依次是1234567890,34567890,567890,7890,90。
#还不了解内部工作原理,先这样理解吧,使用delete时注意可能会出现这样的问题。
'''8.在Spinbox指定位置插入文本'''
#在每项后面添加.00表示精度,同样使用回调函数实现,代码如下:
# -*- coding: cp936 -*-
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不同,倒是可以正确显示。
'''
delete所遇到的问题,insert真的就不会发生吗?再次对上面的代码进行测试,代码如下:
'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
def printSpin():
    # 使用get()方法来得到当前的显示值
    sb.insert(END,'0')
    print sb.get()

sb = Spinbox(root,      
             from_ = 1234,          #最小值
             to = 9999,             #最大值
             increment = 1,
             command = printSpin    #回调函数
             )
sb.pack()
root.mainloop()
#在每个项的后加一个0,即将值变为原来的10倍,则程序的输出结果为123450,99990,同样也出现了异常
#现象,第一个例子的中出现正确的情况纯粹是个偶然,在整数的后添加.00相当于没有对其值进行改变,故下次
#使用的值依旧没有变化。