python基础知识-GUI编程-TK-StringVar
1、如何引出StringVar
之前⼀直认为StringVar就是类似于Java的String类型的对象变量,今天在想要设置StringVar变量的值的时候,通过搜索发现StringVar 并不是python内建的对象,⽽是属于Tkinter下的对象。这个引起了我的兴趣,觉得需要针对性的进⾏学习
2、StringVar的作⽤
查询了很多资料,我们在使⽤界⾯编程的时候,有些时候是需要跟踪变量的值的变化,以保证值的变更随时可以显⽰在界⾯上。由于python⽆法做到这⼀点,所以使⽤了tcl的相应的对象,也就是StringVar、BooleanVar、DoubleVar、IntVar所需要起到的作⽤下⾯是⼀个例⼦,点击button之后,listbox的可选项变成4项,多出⼀个java选项:
def changeItems():
()
tnames = 'python','TCL','ruby','java'
cnames.set(tnames)
root = Tkinter.Tk()
root.minsize(400,200)
root.title("test")
tnames = 'python','TCL','ruby'
cnames = StringVar()
cnames.set(tnames)
l = Listbox(root, listvariable = cnames,height = 10).grid()
ttk.Button(root,text = "submit",command = changeItems).grid()
root.mainloop()
3、有意思的地⽅
上⾯的例⼦其实是对下⾯链接中的例⼦做了改动
这个例⼦中,给StringVar变量的赋值使⽤的是Tuples类型,问题是这种类型是不能进⾏修改的,这会带来了⼀个问题,就是变量如何被修改呢?
于是我将程序进⾏了修改,初步赋值使⽤的是⼀个list,结果出现了让我很意外的事情:
tnames = ['python','TCL','ruby']
cnames = StringVar()
cnames.set(tnames)
l = Listbox(root, listvariable = cnames,height = 10).grid()
这段程序执⾏的结果,listbox中显⽰的list的第⼀个是['python', ⽽第⼆个是'TCL', 第三个是'ruby']
这个事情诡异的是,确实是分解成了三段,但是三段包含了list定义所需要的[],字符串的'',以及分割的, !
于是,我们将程序进⾏了修改,去掉了字符定义的[],见下⾯:
tnames = 'python','TCL','ruby'text函数什么意思
cnames = StringVar()
cnames.set(tnames)
l = Listbox(root, listvariable = cnames,height = 10).grid()
结果,程序显⽰正确
到底这个事情是怎么弄的呢?我们将代码修改⼀下,打印⼏个东西
def changeItems():
()
tnames = 'python','TCL','ruby','java'
cnames.set(tnames)
root = Tkinter.Tk()
root.minsize(400,200)
root.title("test")
tnames = ['python','TCL','ruby']
print tnames.__class__
cnames = StringVar()
cnames.set(tnames)
l = Listbox(root, listvariable = cnames,height = 10).grid()
ttk.Button(root,text = "submit",command = changeItems).grid()
root.mainloop()
执⾏上⾯的代码,从控制台中输出了如下的内容:
<type 'list'>
("['python',", "'TCL',", "'ruby']")
这个说明什么呢?StringVar类型调⽤set函数时,先将变量转变成了tuples类型的数据。所以,实际上最好是调⽤set函数之前就直接使⽤Tuples类型的数据,这样或许更好点。
那么怎么实现函数变量的修改呢?其实很简单了,定义⼀个list,然后将list转换成tuples即可。修改后的函数如下:
def changeItems():
tnames.append('java')
cnames.set(tuple(tnames))
root = Tkinter.Tk()
root.minsize(400,200)
root.title("test")
tnames = ['python','TCL','ruby']
cnames = StringVar()
cnames.set(tuple(tnames))
l = Listbox(root, listvariable = cnames,height = 10).grid()
ttk.Button(root,text = "submit",command = changeItems).grid()
root.mainloop()
4、StringVar的其他函数:
StringVar除了set以外还有其他的函数包括:get()⽤于返回StringVar变量的值、trace(mode, callback) ⽤于在某种mode被触发的时候调⽤callback函数,还有⼀些其他函数。不过⽬前我所使⽤的东西还不包含这些,所以⽬前只是做⼀个记录。详细内容见下⾯的链接
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论