Tkinter变量追踪方法回调的参数是什么?

26

Python有为Tkinter变量设计的类,例如StringVar()BooleanVar()等。它们都共享get()set(string)trace(mode, callback)这些方法。作为trace(mode, callback)的第二个参数传递的callback函数将被传递四个参数:self, n, m, x

以一个BooleanVar()的例子来说明,它们出现为'','PYVAR0','w'

第三个参数x似乎是触发跟踪的模式,在我的情况下变量已更改。然而,第一个变量是什么,看起来像一个空字符串?第二个变量是什么?如果我猜的话,我会说它是某个内部变量的名称?

2个回答

39

第一个参数是内部变量名称。您可以将此名称用作传递给tkinter getvarsetvar方法的参数。如果您为变量命名(例如:StringVar(name ='foo')),则这将是给定的名称,否则它将是由tkinter为您生成的名称(例如:PYVAR0

如果第一个参数表示列表变量(在tkinter中极不可能),则第二个参数将是该列表中的索引。如果它是标量变量,则第二个参数将为空字符串。

第三个参数是操作,如果您正在使用相同的方法读取、写入和/或删除变量时很有用。此参数告诉您触发回调的操作之一。它将是“read”、“write”或“unset”中的一个。

Tkinter是围绕tcl/tk解释器的Python封装器。关于变量跟踪的权威文档可以在此处找到:http://tcl.tk/man/tcl8.5/TclCmd/trace.htm#M14。但是,这仅记录了内部跟踪如何工作,tkinter封装器有时会对数据进行处理。


3
如果跟踪回调是类实例中的方法,那么第一个参数非常有用。在这种情况下,第一个参数指向类实例。还可能有其他情况,其中回调的“作用域”使第一个参数非常有用。 - GaryMBloom
2
我忘了提到,如果在创建变量时给它命名(使用'name'关键字),那么该名称将作为第一个参数传递给回调函数,而不是不太有用的通用tkinter名称。这使您可以更轻松地在多个变量之间共享回调函数(如果需要)。并且,如果您有动力,可以使用该名称直接访问变量,例如通过将变量存储在字典中,尽管我不确定这是否会给您带来麻烦。 - GaryMBloom
1
第一个参数并不是无用的。请参考下面@Keith Caufield的答案。您可以将变量(第一个参数)的名称分配给一个变量,然后可以使用get()方法获取该值。例如temp_var = IntVar(name=args[0]),然后您可以执行temp_var.get()。请在有时间的时候更新答案。谢谢。 - Francesco
@Francesco:我已经更新了我的答案。感谢您的评论。 - Bryan Oakley

14

第一个参数是变量的名称,但并不是“无用”的,因为您可以在声明变量时设置它,例如:

someVar = IntVar(name="Name of someVar")

当您在跟踪回调中检查第一个参数时,它将等于"someVar的名称"。通过使用名称来区分变量,您可以将相同的处理程序绑定到任意数量的变量以跟踪更改,而不需要为每个变量都需要单独的处理程序。


我不知道你可以给它们命名。谢谢。 - Andrew H
3
提供有用的信息是好的,但这本身不是对OP问题的回答。它应该以评论的形式出现在@Bryan Oakley的回答下面。 - martineau
2
如果这个答案包含了让我通过名称检索变量的tkinter函数,那么它会更加有用。nametowidget()成员函数似乎只知道关于小部件的信息(正如其名称所暗示的那样)。 - josch
这个回答真的应该作为被接受的答案加入进去!!!它完完全全就是我在寻找的,但是由于主要回答说第一个参数是无用的,所以我花了10分钟才找到它。它绝对不是无用的。通过使用那个变量名,你可以拥有一个 StringVar 列表,然后当其中一个发生改变时,你就可以知道哪一个在列表中改变了!非常感谢你! - Francesco
你能否在回答中提供一个语法示例,以证明你的说法:“您可以将相同的处理程序绑定到跟踪任意数量的变量的更改,而不需要为每个变量单独创建处理程序。”? - Sun Bear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接