tkin中的依赖小部件

2024-09-24 02:24:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中有一个使用Tk的小型GUI应用程序。它有几个过滤器——一个文本条目(它们设置过滤器值)和复选框(设置过滤器开/关)。我将过滤器创建为从ttkLabelframe中继承的类:

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)

然后我创建了这个类的几个实例,并将它们放在GUI中:

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

创建并正确显示小部件。但是,当其中一个复选框被单击并更改状态时,另一个复选框也会更改状态!你知道吗

单击不同的复选框时,print命令输出.!filterwidget.!filterwidget2,因此它们是独立的对象。似乎它们是某种隐含的同步,但我不知道这是怎么发生的。你知道吗

所以,问题是:如何消除这种依赖性,使复选框相互独立?你知道吗


Tags: self过滤器tkinterguicolumnrootfiltertk
1条回答
网友
1楼 · 发布于 2024-09-24 02:24:19

正如the docs提到的

To use a Checkbutton, you must create a Tkinter variable. To inspect the button state, query the variable.

下面是更新后的代码,使用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()

相关问题 更多 >