python - Tkinter Checkbutton 变量
问题描述
我不擅长 tkinter 甚至 python,所以我遇到了应该是一个简单的问题。
我的项目中间有这样的事情:
visible = numLevels * [IntVar(value=1)]
top = Toplevel()
settingslabel = Label(top, text='Settings', height=0, width=100)
for i in range(0, numLevels ):
check = ttk.Checkbutton(settingslabel, text='Level ' + str(i), variable=visible[i])
check.grid(column = 0, row = i)
check.var = visible[i]
settingslabel.grid(column = 0, row=0)
我想为每个级别设置一个带有复选框的设置屏幕,同时维护一个表示每个按钮状态的整数数组。
但是,所有复选框都是同步的。这意味着,当我选中一个框时,所有其他框也会被选中。我相信这是因为复选按钮的“变量”字段。随着循环的继续, i 被更新,结果, visible[i] 也发生了变化。我想在创建复选按钮时保留变量。我不明白 tkinter/python 是如何工作的好到足以知道。
数字级别可以是任何大于 0 的整数,并且在运行时确定,所以我不能只是展开循环。
有一个更好的方法吗?提前致谢。
解决方案
这是此SO 帖子的副本,但解释如下。
这是因为你所有的盒子都共享同一个tkinter.Intvar()
对象:
numlevels = 5
visible = numlevels * [IntVar(value = 1)]
for i in range(len(visible)):
print (hex(id(visible[i]))
# Outputs:
'0x67f8190'
'0x67f8190'
'0x67f8190'
'0x67f8190'
'0x67f8190'
要解决:visible = [IntVar(value = 1) for i in range(numlevels)]
推荐阅读
- c# - 如何在 Angular 中禁用 Web 服务调用跟踪
- sql - 从多个表中获取记录的问题
- javascript - Three.js OrbitControls 方位角接近 +/-180 度
- python - 如何从不同的列表向特定列表插入不同的值
- vba - VBA 使用单元格值而不是单元格名称
- circleci - CircleCI 运行 pylama/pycodestyle 未终止
- reactjs - 如何使用 React Router 添加嵌套和非嵌套路由 - ReactJS?
- woocommerce - 错误:在 Woocommerce 中没有使用 Susy 命名转换的 mixin
- python - 使用资源组标签在 Azure 中用于资源组代码删除的 Python 代码
- android - 屏幕关闭时在后台请求位置更新的最佳选择 7+ android