Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态变量始终链接到Python中的方法_Python_Variables_Tkinter_Global Variables - Fatal编程技术网

动态变量始终链接到Python中的方法

动态变量始终链接到Python中的方法,python,variables,tkinter,global-variables,Python,Variables,Tkinter,Global Variables,我创建一个tkinter根目录: root = tkinter.Tk() 并希望创建一个动态变量,该变量将始终链接到根的某个属性(或称为方法?): X = root.winfo_width() 如果root的winfo_width()更改,我希望X自动更新 如何做到这一点? 它叫别名吗?动态变量?如果您只需要一个速记 X = root.winfo_width print X() 我将告诉您如何创建函数的“别名”,希望对您有所帮助 def X(): return root.winf

我创建一个tkinter根目录:

root = tkinter.Tk()
并希望创建一个动态变量,该变量将始终链接到
根的某个属性(或称为方法?):

X = root.winfo_width()
如果
root
winfo_width()
更改,我希望
X
自动更新

如何做到这一点?
它叫别名吗?动态变量?

如果您只需要一个速记

X = root.winfo_width

print X()

我将告诉您如何创建函数的“别名”,希望对您有所帮助

def X():
    return root.winfo_width()

您创建了该定义,因此每次调用“X()”都会得到root.winfo_width()的值。如果root.winfo_wifth()的值发生变化,并且您调用了X(),您将得到更新后的值,具体取决于您需要什么,
@property
decorator可能会执行此操作(基于@BrenBarn的回答):

但这可能是一个与解释器相关的技巧,但您仍然可以执行以下操作:

>>> x.x
1386929251.14
>>> x.x
1386929253.01

如果您有几个这样的“动态属性”,您可以将它们分组到一个类中,并以这种方式访问它们(但就可读性而言,隐藏属性的动态行为可能不是一个好主意)。

问题在于,尽管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()。显式优于隐式。

普通变量不可能做到这一点。但是,如果您有一个对象
obj
,则可以将其设置为
obj.x
在引擎盖下访问
root.winfo_width()
,因此它始终返回“synced”值。确定。如何设计这样一个对象?或者另一个解决方案:有没有办法创建别名:X只是一个快捷方式,被解释为
root.winfo_width()
?你想用
X
做什么?只要在我的代码中到处读
X
,就行了,谢谢!是否可以使用
X
(而不是
X()
)作为
根的简写。winfo\u width
?否。
X
是一个值
X()
是一个函数。您想调用一个函数(
root.winfo_width
);因此,您必须使用函数来执行此操作。即使您可以编写
X
,如果
X
(一个值)突然且不明显地发生变化,也会使代码完全无法读取。我不是说lambdas,而是说“X=root.winfo_width()如果root.winfo_width,则不更新X的值changes@Liarez:您在控制台中键入了错误的内容。请在不带括号的情况下重试。
x.y
x = root.winfo_dimensions()
print x['width']