我正在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()