问题描述
假设我有一个自定义小部件,它本质上是两个字段,每个字段都有一个关联的 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 (将#修改为@)