解决 Tkinter 中的循环变量依赖

问题描述

假设我有一个自定义小部件,它本质上是两个字段,每个字段都有一个关联的 tkinter StringVar/Intvar。目标是让这个自定义小部件允许拥有它自己的变量成员,您可以将其传递给它并像大多数基本组件一样使用,在那里您绑定到它,使用它的 get 和 set 来读取/更新小部件值。

我遇到的问题是,我能提出的任何配置都会导致形成无限循环的循环引用问题。请参阅我在下面尝试的示例:

from tkinter import Intvar,StringVar
from tkinter.ttk import Frame,Entry


class CustomWidget(Frame):
    def __init__(self,master,textvariable=None,**kw):
        super().__init__(master,**kw)
        self._variable = textvariable or StringVar()

        self._variable.trace_add('write',self._on_external_change)

        self._entry_internal_var = Intvar(self)
        self._entry = Entry(self,textvariable=self._entry_internal_var)
        self._entry.pack()

        self._other_entry_interval_var = StringVar(self)
        self._other_entry = Entry(self,textvariable=self._other_entry_interval_var)
        self._other_entry.pack()

        self._entry_internal_var.trace_add('write',self._on_value_changed)
        self._other_entry_interval_var.trace_add('write',self._on_value_changed)

    def _on_value_changed(self,*_,**__):
        self._variable.set('{}_{}'.format(self._entry_internal_var.get(),self._other_entry_interval_var.get()))

    def _on_external_change(self,**__):
        temp = self._parse_string_into_value(self._variable.get())
        self._entry_internal_var.set(temp[0])
        self._other_entry_interval_var.set(temp[1])

    @staticmethod
    def _parse_string_into_value(value: str):
        temp = value.split('_')
        return int(temp[0]),temp[1]

我这样做的原因是因为我希望能够对传递给 __init__ 方法的变量使用变量更新回调,但显然我遇到了每次更新都会导致循环的问题_variable 的 trace 方法更新了我的内部变量,并导致 _variable 的更新。

所以我的问题是,有没有办法在不引起这种循环的情况下修改传递变量的值?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)