我需要在滚动的文本小部件内部设置检查按钮,每行一个按钮,每个按钮后面有一些文本。我发现这个解决方案是一个stackoverflow:
Tkinter checkbuttons inside of a Text widget and scrolling
这是一段剪切的代码:
for i in range(1000):
bg = 'grey'
if i % 2 == 0:
bg = 'white'
cb = tk.Checkbutton(text="checkbutton #%s" % i, bg=bg, width=35, justify=tk.LEFT)
text.window_create("end", window=cb)
text.insert("end", "\n") # to force one checkbox per line
这对我来说没有多大意义,因为虽然正确显示了检查按钮,但您无法访问每个按钮。或者我错了吗?
答案 0 :(得分:1)
与任何其他python对象一样,为了在其上调用方法,您需要有一个引用。最简单的解决方案是在列表或字典中保留对窗口小部件和变量的引用。
例如:
import tkinter as tk
class Example(object):
def __init__(self):
root = tk.Tk()
text = tk.Text(root, cursor="arrow")
vsb = tk.Scrollbar(root, command=text.yview)
button = tk.Button(root, text="Get Values", command=self.get_values)
text.configure(yscrollcommand=vsb.set)
button.pack(side="top")
vsb.pack(side="right", fill="y")
text.pack(side="left", fill="both", expand=True)
self.checkbuttons = []
self.vars = []
for i in range(20):
var = tk.IntVar(value=0)
cb = tk.Checkbutton(text, text="checkbutton #%s" % i,
variable=var, onvalue=1, offvalue=0)
text.window_create("end", window=cb)
text.insert("end", "\n")
self.checkbuttons.append(cb)
self.vars.append(var)
text.configure(state="disabled")
root.mainloop()
def get_values(self):
for cb, var in zip(self.checkbuttons, self.vars):
text = cb.cget("text")
value = var.get()
print("%s: %d" % (text, value))
if __name__ == "__main__":
Example()