python 之一道小题目

今天组长大人丢来了一道题目,说这里面有错

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()
View Code

执行如图

原文地址:https://www.cnblogs.com/pheobe/p/6293818.html