Я работаю над приложением в tkinter
. У меня есть много виджетов Entry в пользовательском интерфейсе и несколько классов в движке приложения. Мне нужно связать переменные tkinter этих записей с атрибутами экземпляров.
т.е:.
class Pipe(Variable):
"""class for pipes"""
def __init__(self):
self.diameter = 0
self.variables = {}
pipe1 = Pipe(self)
pipe2 = Pipe(self)
Я хочу связать значение из одной записи с pipe1.diameter
, а значение с другой записи с pipe2.diameter
. Я делаю это с помощью функции trace
, где есть оператор lambda
, указывающий на функцию, которая идентифицирует запись, и, используя собственный словарь для каждого экземпляра, передает значение из записи в значение словаря. Словари создаются как здесь, а затем передаются как атрибут экземпляра:
def pipe1_vars(object_):
variables = {
'ui_variable_name_for_pipe1_diameter': [object_.diameter]
}
return variables
def pipe2_vars(object_):
variables = {
'ui_variable_name_for_pipe2_diameter': [object_.diameter]
}
return variables
pipe1.variables = pipe1_vars(pipe1)
pipe2.variables = pipe2_vars(pipe2)
К сожалению, Variable
метод класса, присваивающий значение, не работает должным образом.
class Variable():
def set_var_value(variable_name, value):
ui_variable = tkinterbuilder.get_variable(variable_name)
self.variables[variable_name][0] = value
if ui_variable.get() != value:
ui_variable.set(value)
Очевидно, self.variables[variable_name][0]
- это нечто иное, чем self.diameter
. Значение словаря меняется, но instance.diameter
остается прежним.
Как я могу передать атрибут реального экземпляра этому методу вместо копии в значении словаря?
Я предполагаю, что для моего приложения важно создать что-то, работающее как эти словари, потому что мне нужно привязать похожие атрибуты разных каналов к разным записям - так что это должно быть определено вне класса Pipe()
. Я не знаю, должен ли я изменить словарь на что-то другое, или, может быть, я должен перестроить эти функции, создав словарь. У меня закончились идеи, что спросить в гугле.
Код очень сложный, я разместил только самые важные элементы, но если важны какие-либо другие детали, пожалуйста, обратите внимание в комментарии.