今天组长大人丢来了一道题目,说这里面有错
def changeItems(): print cnames.get() tnames = 'python','TCL','ruby','java' cnames.set(tnames) root = Tkinter.Tk() root.geometry('+400+200') 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()
刚开始看又懵逼了。从来没听说过tkinter
后来稍微了解了下,是PYTHON中自带的GUI控件。
短短几句话可以创建出一个窗口来,可比我之前知道的Windows编程简洁多了。
说实话,看这段代码的时候,我连set是干嘛的都忘了,
赶紧回看了下廖老师写的set与dict,还有tuple和list
唉用的太少就是记不住。
tuple:创建就不可修改,除非里面有个元素是list类型
用()
list:可以增删改查,append(加到末尾),pop(删除),insert(插入指定位置),
用[]
dict:字典,有key有value,key不可变
用{}
set:key的集合,不存在value,要创建一个set,需要提供一个list作为输入集合,例如
>>> s = set([1, 2, 3]) >>> s {1, 2, 3}
可以remove,add,不会有重复元素
用()
接下来看看我修改的代码
from Tkinter import * import ttk def changeItems(): print cnames.get() tnames=['python','TCL','ruby','java'] cnames.set(tnames) root = Tk() root.geometry('+400+200') 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()
可以运行,但是如图是这样
怎么多出来那么多个符号,分明就是序列的中括号没有起作用呀
后来在http://jxdeng04.iteye.com/blog/1798066
终于找到了答案
原来是stringvar搞的鬼。
这个函数使用set后会直接把序列变成元祖,
我们应该在set之前就要把它变成元祖才对。
所以修改为
from Tkinter import * import ttk def changeItems(): print cnames.get() tnames=['python','TCL','ruby','java'] cnames.set(tuple(tnames)) root = Tk() root.geometry('+400+200') 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()
执行如图