为什么这些Python tkinter检查按钮链接在一起?

时间:2019-11-14 19:46:01

标签: python tkinter tkinter.checkbutton

我目前正在尝试创建一个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()

2 个答案:

答案 0 :(得分:3)

TL; DR

您需要为每个复选框指定唯一的variable

var_L1 = tk.IntVar()
var_R1 = tk.IntVar()
...
check_L1 = Checkbutton(..., variable=var_L1)
check_R1 = Checkbutton(..., variable=var_R1)
...

发生了什么

检查按钮需要与之关联的变量。您没有显式设置变量,因此tkinter会创建默认值。 Tkinter通过创建以复选按钮名称命名的内部变量来实现此目的。

当您创建窗口小部件并且不给它们命名时,tkinter将选择默认名称。全名包括整个窗口小部件层次结构的名称。因此,例如,check_L1的内部名称为.!frame.!checkbutton'check_R1的名称为.!frame2.!checkbutton,而checktype1的内部名称为{{1 }}。

当tkinter为复选按钮创建默认变量时,它仅使用变量全名的最后一部分。因此,它为'.!frame3.!checkbutton'创建了一个内部变量check_L1!checkbutton的内部变量也为check_R1!checkbutton的内部变量也是如此。

由于所有这些复选框共享相同的内部变量,因此它们被链接。

答案 1 :(得分:1)

我不确定为什么会发生这种情况,但是您可以通过将其与变量相关联来使复选按钮独立:

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", variable=IntVar())
check_L2 = Checkbutton(leftFrame, text = "C2", bg = "#4d94ff", variable=IntVar())

check_R1 = Checkbutton(rightFrame, text = "C1", bg = "#ff4d4d", variable=IntVar())
check_R2 = Checkbutton(rightFrame, text = "C2", bg = "#ff4d4d", variable=IntVar())

checktype1 = Checkbutton(bottomFrame, text = "Check Type 1", bg = "#5cd65c", variable=IntVar())
checktype2 = Checkbutton(bottomFrame, text = "Check Type 2", bg = "#5cd65c", variable=IntVar())

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