我试图制作一种“桌子”,在其一侧上有图像和文本,并在表格的每一行旁边都有一个复选按钮。该表格应有2列。我要做的是创建一个类的Tabel,并用2个框架将其夹起来。问题是,当我标记一个按钮时,他相反的按钮也被标记。
*****编辑: 好吧,当我尝试使所有标记为按钮时,我不小心解决了 在下面的代码中添加了标记的行,并解决了问题,但我不知道为什么。我很乐意进行解释(标记为“ ****”)
图片:
之前:
之后:
代码:
from tkinter import *
from PIL import Image, ImageTk
class Example(Frame):
def __init__(self, root, side):
Frame.__init__(self, root)
self.root = root
*******new: self.ver_list = [IntVar(value=1) for i in range(1, 202)]
self.vsb = Scrollbar(self, orient="vertical")
self.text = Text(self, width=40, height=20,
yscrollcommand=self.vsb.set)
self.im = Image.open("pic.png")
self.tkimage = ImageTk.PhotoImage(self.im)
self.vsb.config(command=self.text.yview)
self.vsb.pack(side="{}".format(RIGHT if side else LEFT), fill="y")
self.text.pack(side="left", fill="both", expand=True)
if side:
for i in range(1, 101):
cb = Checkbutton(self, text="checkbutton #%s" % i, indicatoron=True, image=self.tkimage, compound=LEFT)
cb.config(font=("Courier", 15))
new***: self.cb.config(variable=self.ver_list[i])
self.text.window_create("end", window=cb)
self.text.insert("end", "\n") # to force one checkbox per line
else:
for i in range(101, 201):
cb = Checkbutton(self, text="checkbutton #%s" % i, indicatoron=True, image=self.tkimage, compound=LEFT)
cb.config(font=("Courier", 15))
new***: self.cb.config(variable=self.ver_list[i])
self.button_list.append(cb)
self.text.window_create("end", window=cb)
self.text.insert("end", "\n") # to force one checkbox per line
if __name__ == "__main__":
root = Tk()
frame1 = Frame(root)
frame2 = Frame(root)
Example(frame1, 0).pack(side="top", fill="both", expand=True)
Example(frame2, 1).pack(side="top", fill="both", expand=True)
frame1.grid(row=0, column=0)
frame2.grid(row=0, column=1)
root.mainloop()
答案 0 :(得分:1)
尝试使用print(cb["variable"])
,在旧版本中,您将看到两个具有相同ID的变量-!checkbutton
与!checkbutton2
,!checkbutton3
等相同
因此,第一个Example()
创建具有一些默认名称的局部变量,但第二个Example()
也创建具有默认名称的局部变量,但是它不知道这些名称已经存在。
这样,两个复选按钮使用具有相同名称的变量。
在新代码中,您创建具有202个IntVar
的列表,并且它们具有唯一的ID,因此每个Checkbutton
都使用具有唯一ID的变量。
if side:
for i in range(1, 101):
cb = Checkbutton(self, text="checkbutton SIDE #%s" % i, indicatoron=True, compound=LEFT)
cb.config(variable=self.ver_list[i]) #new***:
print(cb["variable"])
self.text.window_create("end", window=cb)
self.text.insert("end", "\n") # to force one checkbox per line
else:
for i in range(101, 201):
cb = Checkbutton(self, text="checkbutton #%s" % i, indicatoron=True, compound=LEFT)
cb.config(variable=self.ver_list[i])#new***:
print(cb["variable"])
self.text.window_create("end", window=cb)
self.text.insert("end", "\n") # to force one checkbox per line