python - 为什么这些 Python tkinter 检查按钮是链接的?
问题描述
我目前正在尝试创建一个 GUI 来比较两个不同文件夹之间的文件,并拥有一个我现在正在尝试构建的基本框架。
我在窗口的左侧、右侧和底部有三个框架,每个框架有两个复选按钮。我希望能够彼此独立地选择每个复选按钮,但是每次单击任何一个框架的第一个复选按钮时,其他框架的第一个复选按钮也会同时选择/取消选择。
为什么会这样,我如何让它们彼此独立工作?这是我的代码供参考:
from tkinter import *
root = Tk()
leftFrame = Frame(root, bg = "#4d94ff")
leftFrame.pack(side = LEFT, fill = BOTH)
rightFrame = Frame(root, bg = "#ff4d4d")
rightFrame.pack(side = RIGHT, fill = BOTH)
bottomFrame = Frame(root, bg = "#5cd65c")
bottomFrame.pack(side = BOTTOM)
check_L1 = Checkbutton(leftFrame, text = "C1", bg = "#4d94ff")
check_L2 = Checkbutton(leftFrame, text = "C2", bg = "#4d94ff")
check_R1 = Checkbutton(rightFrame, text = "C1", bg = "#ff4d4d")
check_R2 = Checkbutton(rightFrame, text = "C2", bg = "#ff4d4d")
checktype1 = Checkbutton(bottomFrame, text = "Check Type 1", bg = "#5cd65c")
checktype2 = Checkbutton(bottomFrame, text = "Check Type 2", bg = "#5cd65c")
check_L1.grid(row = 0)
check_L2.grid(row = 0, column = 1)
check_R1.grid(row = 0)
check_R2.grid(row = 0, column = 1)
checktype1.grid(row = 0)
checktype2.grid(row = 1)
root.mainloop()
解决方案
TL;博士
您需要为variable
每个检查按钮指定一个唯一的。
var_L1 = tk.IntVar()
var_R1 = tk.IntVar()
...
check_L1 = Checkbutton(..., variable=var_L1)
check_R1 = Checkbutton(..., variable=var_R1)
...
怎么了
复选按钮需要一个与它们相关联的变量。您没有明确设置变量,因此 tkinter 正在创建默认值。Tkinter 通过创建以复选按钮名称命名的内部变量来做到这一点。
当您创建小部件并且不给它们命名时,tkinter 将选择默认名称。全名包括整个小部件层次结构的名称。因此,例如, is 的内部名称、check_L1
is.!frame.!checkbutton'
的名称和check_R1
is.!frame2.!checkbutton
的内部checktype1
名称'.!frame3.!checkbutton'
。
当 tkinter 为检查按钮创建默认变量时,它仅使用变量全名的最后一个组件。因此,check_L1
它创建了一个名为 的内部变量!checkbutton
。的内部变量check_R1
也是!checkbutton
, 的内部变量也是checktype2
。
因为所有这些检查按钮共享相同的内部变量,所以它们是链接的。
注意:如果您在循环中创建大量复选框,则可以将对每个复选框的引用保存在数组中。例如:
vars = []
for i in range(x):
vars.append[tk.IntVar())
...
check_L1 = Checkbutton(..., variable=vars[0])
...
print(f"the value of L1 is {vars[0].get()}")
推荐阅读
- python - 如何在二维数组中存储字符串和坐标?
- c# - IConfiguration.GetSection() 作为属性返回 null
- go - 从大文本中删除所有非字母数字字符的有效方法
- laravel - 在ajax需要加载一个字段值并使用范围值创建一个select_from_array之后
- vue.js - Highcharts-vue:带有向下钻取的堆叠列
- scala - 如何获取集群的最小值和最大值
- reactjs - 如何修复动态布尔变量分配的 FlowJS 错误?
- bash - 如何替换 URL 中的值
- android - 应用程序被杀死但 onTrimMemory 没有被调用
- firebase - 如何与不同的用户组进行登录和登录