我创建一个tkinter根:
root = tkinter.Tk()
并且想要创建一个动态变量,该变量将始终链接到root
:的某个属性(或者它被称为方法?)
X = root.winfo_width()
如果root
的winfo_width()
发生更改,我希望X
自动更新。
如何做到这一点?它叫别名吗?一个动态变量?
如果你只想要一个简写,
X = root.winfo_width
print X()
问题是,尽管Python确实是动态的,但有一些事情总是做着完全相同的事情,这是无法改变的。
一个是简单的任务:
x = ...some complex expression...
这总是做同样的事情:它计算"某个复杂的表达式",然后x被更改,现在它是对表达式结果的引用。
另一种是变量评估:
x
简单地使用一个变量永远不会调用任何代码、方法或任何东西——在使用x的表达式中,x只是被它所指的任何东西"替换"
所以,做你想做的事情是不可能的,没有地方可以添加一些动态的东西。方法查找是一个明显的替代方案:
x.y
在这里,你可以实现x.getattr来返回你需要的东西(太棘手了),或者你可以给x一个属性方法y(就像其他答案一样)。
另一件事是,x可以引用一个可变的对象,而改变的可能是x的内容。例如,如果x指字典,
x = root.winfo_dimensions()
print x['width']
然后,您可以使root
保留该字典本身的一个实例,并在宽度更改时更新它。也许它只保留一个并返回。但是,您也可以从其他地方更改内容,这很棘手。
我根本不会这么做,只在需要的地方调用root.winfo_width()。显式比隐式好。
根据您的具体需求,@property
装饰器可能会起作用(基于@BrenBarn的答案):
class X(object):
@property # <-- this 'decorator' provides the necessary magic
def x(self):
return time.time() # <-- just for example of refresh
def __repr__(self):
return str(self.x)
现在我们可以做:
>>> x = X()
>>> x
1386929249.63
>>> x
1386929250.27
但这可能是一个与解释器相关的技巧,但你仍然可以做到以下几点:
>>> x.x
1386929251.14
>>> x.x
1386929253.01
如果你有几个这样的"动态属性",你可以将它们分组在一个类中,并以这种方式访问它们(但就可读性而言,隐藏属性的动态行为可能不是一个好主意)。
我将告诉您如何创建函数的"别名",希望它能对您有所帮助。
def X():
return root.winfo_width()
你做了这个定义,所以每次你调用"X()"时,你都会得到root.winfo_width()的值。如果root.winfo_wifth()值发生变化,你调用X(),你就会得到更新后的值