如何获取对实例属性的引用,并从外部修改其值



我正在tkinter中开发一个应用程序。我在UI中有许多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有所不同。dictionary值正在更改,但instance.diameter保持不变。

如何将实际实例属性传递给此方法,而不是字典值中的副本?

我认为构建像这些字典一样工作的东西对我的应用程序来说很重要,因为我需要将不同管道的类似属性绑定到不同的条目,所以它必须在Pipe()类之外定义。我不知道我是应该把dictionary改成其他东西,还是应该重建这些函数,构建dictionary。我已经没有什么想法了,该问谷歌什么。

代码非常复杂,我只发布了最重要的元素,但如果有其他重要的细节,请在评论中注明。

如果Pipe属性的数量很小,则将其设为属性,并且在创建Pipe对象时,向其传递相应的tk-binded变量:

import tkinter as tk
from tkinter import Tk, ttk
root = Tk()
var_e1 = tk.StringVar()
def print_e1():
print(var_e1.get())
def inc_e1():
var_e1.set(int(var_e1.get())+1)
class Pipe():
def __init__(self, tkvar):
self.tkvar = tkvar
tkvar.set('')
@property
def diameter(self):
return self.tkvar.get()
@diameter.setter
def diameter(self, value):
self.tkvar.set(value)
e1 = tk.Entry(root, textvariable=var_e1)
b1 = tk.Button(root, text='Print e1', command=print_e1)
b2 = tk.Button(root, text='Increment e1', command=inc_e1)
e1.pack(side=tk.LEFT)
b1.pack()
b2.pack()
p1 = Pipe(var_e1)
p1.diameter = 200
root.mainloop()

最新更新