Tkinter:如何检查特定框架的任何小部件是否已更改?

Tkinter: How can I check if any of the widgets of a specific frame have changed?

检查给定框架 (frm1) 的任何小部件(或链接到它的变量)是否已更改并采取措施的最佳方法是什么。例如激活一个按钮。

我希望当在条目中输入内容或更改组合框或复选框时,'changed_content' 函数将被执行

from tkinter import *
from tkinter import ttk
from tkinter.messagebox import showinfo

class Defaultframe(Tk):
    def __init__(self):
        Tk.__init__(self)

        self.geometry('500x300')
        self.title('Tkinter')

        self.text1 = StringVar()
        self.text2 = StringVar()
        self.text3 = StringVar()
        self.var1 = IntVar()
        self.var2 = IntVar()

        self.set_widgets()
        return


    def changed_content(self):
        showinfo('Information', 'The content has been changed')
        self.btn2.configure(state='normal')
        return


    def set_widgets(self):
        #Frame1
        self.frm1 = ttk.Frame(self).pack(side=TOP)

        self.lbl = ttk.Label(self.frm1, text='Text1').pack(pady=5)
        self.ent1 = ttk.Entry(self.frm1, textvariable=self.text1).pack(pady=5)

        self.lbl = ttk.Label(self.frm1, text='Text2').pack(pady=5)
        self.my_ent = ttk.Entry(self.frm1, textvariable=self.text2).pack(pady=5)

        self.cbb = ttk.Combobox(self.frm1, 
                        values=[0, 30, 60, 90, 120, 150, 180],
                        state='readonly',
                        textvariable=self.var2)
        self.cbb.pack(pady=5)
        self.cbb.current(3)

        self.ckb = ttk.Checkbutton(self.frm1, text='Hello', variable=self.var1, onvalue=1, offvalue=0).pack(pady=5)
        #---

        

        #Frame2
        self.frm2 = ttk.Frame(self).pack(side=BOTTOM, fill=X)
        ttk.Separator(self.frm2, orient=HORIZONTAL).pack(side=TOP, expand=1, fill=X)
        self.my_ent3 = ttk.Entry(self.frm2, textvariable=self.text3).pack(side=LEFT, padx=1)
        self.btn1 = ttk.Button(self.frm2, text='Cancel').pack(side=RIGHT, padx=1)
        self.btn2 = ttk.Button(self.frm2, text='Save')
        self.btn2.pack(side=RIGHT, padx=1)
        self.btn2.configure(state=DISABLED)
        #---


if __name__== '__main__':
    app = Defaultframe()
    app.mainloop()

解决 任何 小部件很困难 - 您必须专门为 canvas 或滚动条或 的任何其他小部件编写代码 没有与 tkinter 变量关联。

对于 与 tkinter 变量相关联的小部件,您可以应用跟踪,只要值发生变化就会调用函数。

在您的代码中,它可能看起来像这样:

class Defaultframe(Tk):
    def __init__(self):
        ...
        self._watch_variables(self.text1, self.text2, self.text3, self.var1, self.var2)

    def _watch_variables(self, *vars):
        for var in vars:
            var.trace_add("write", self._handle_trace)

    def _handle_trace(self, *args):
        self.changed_content()