[转]Tkinter教程之Spinbox篇

上一篇 / 下一篇  2011-07-19 10:25:27 / 个人分类:Python-Tkinter

'''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()
= 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()
= 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相当于没有对其值进行改变,故下次
#
使用的值依旧没有变化。

TAG:

 

评分:0

我来说两句

Open Toolbar