tkinter

时间:2017-10-20 06:49:42

标签: python tkinter

我在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命令会输出.!filterwidget2self.physicsWorld.gravity = CGVector(CGFloat((data?.acceleration.x)!) * 10, CGFloat((data?.acceleration.y)!) * 10) ,因此这些是单独的对象。似乎它们在某种程度上是隐式同步的,但我不知道这是怎么发生的。

所以,问题是:如何消除这种依赖性并使复选框彼此独立?

1 个答案:

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