checkbutton组循环值总为最后一个即如果checkbuttons>=2则只有最后一个点击有效
有个场景是需要将数据库的值拿来用for循环生成一组checkbutton,其中有个问题就是在循环中写的checkbutton点击后获取的值有问题,当checkbutton数大于等于2时,只有最后一个chekcbutton点击后能返回正确的值
如果是分开写每个checkbutton都声明则无问题。虽然搞不懂为什么,一开始以为是创造出来的变量都是同一个,然后打印了一下发现都是不同的,个人认为和一个个声明无区别,也用过globals()[]来动态声明,结果相同。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 from Tkinter import * 2 def callCheckbutton(state): 3 print state.get() 4 print states 5 print checkbuttons 6 root = Tk() 7 texts = ['aaa', 'bbb', 'ccc'] 8 states = [] 9 checkbuttons = [] 10 for i in range(len(texts)): 11 state = BooleanVar() 12 states.append(state) 13 cb = Checkbutton(root, text=texts[i], variable=state, 14 command=lambda:callCheckbutton(state)) 15 checkbuttons.append(cb) 16 cb.pack() 17 root.mainloop()
截图:
我的解决方法:
将每个checkbutton绑定鼠标左键点击方法,在event中有一个event.widget可以获得当前点击的部件,然后和chekcbutton列表以及status列表进行对比
Entry输入框得到的值的类型是unicode
其实这个应该算是数据库问题,在把unicode的值存入到mysql过程中,如果是解码成字符存入,mysql会把\给去掉,再从数据库中拿出来自己加上\会导致没法还原成原来的数据,所以把mysql的库、表和字段用COLLATE utf8mb4_unicode_ci 都改为能接受unicode的值即可或者用Sqlite3数据库,可以直接接受unicode值。