我在Python中有一个使用Tk的小型GUI应用程序。它有几个过滤器---带有复选框的文本条目(它们设置过滤器值)(设置过滤器打开/关闭)。我将过滤器创建为一个从ttk
Labelframe
from tkinter.ttk import Labelframe
import tkinter as tk
class FilterWidget(Labelframe):
def __init__(self, parent, label):
Labelframe.__init__(self, parent, text=label)
self.grid()
self._entry = tk.Entry(self)
self._entry.grid(row=0, column=0)
self._checkbox = tk.Checkbutton(self, command=lambda: print(self))
self._checkbox.grid(row=0, column=1)
开始的类:
root = tk.Tk()
source_filter = FilterWidget(root, "Source")
source_filter.grid(row=0, column=0)
level_filter = FilterWidget(root, "Severity")
level_filter.grid(row=0, column=1)
root.mainloop()
然后我创建了这个类的几个实例并将它们放在GUI中:
print
创建并正确显示小部件。但是,当单击其中一个复选框并更改状态时,另一个也会更改状态!
单击不同的复选框时,.!filterwidget
命令会输出.!filterwidget2
和self.physicsWorld.gravity = CGVector(CGFloat((data?.acceleration.x)!) * 10, CGFloat((data?.acceleration.y)!) * 10)
,因此这些是单独的对象。似乎它们在某种程度上是隐式同步的,但我不知道这是怎么发生的。
所以,问题是:如何消除这种依赖性并使复选框彼此独立?
答案 0 :(得分:2)
正如the docs提到的那样,
要使用Checkbutton,您必须创建一个Tkinter变量。检查 按钮状态,查询变量。
这是您更新的代码,使用IntVar存储Checkbutton状态。
from tkinter.ttk import Labelframe
import tkinter as tk
class FilterWidget(Labelframe):
def __init__(self, parent, label):
Labelframe.__init__(self, parent, text=label)
self._entry = tk.Entry(self)
self._entry.grid(row=0, column=0)
self._var = tk.IntVar()
callback = lambda: print(self._entry.get(), self._var.get())
checkbox = tk.Checkbutton(self, variable=self._var, command=callback)
checkbox.grid(row=0, column=1)
root = tk.Tk()
source_filter = FilterWidget(root, "Source")
source_filter.grid(row=0, column=0)
level_filter = FilterWidget(root, "Severity")
level_filter.grid(row=0, column=1)
root.mainloop()