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

Too*_*bel 17 python tkinter

Python有Tkinter的变量类StringVar(),BooleanVar()等等,这些都共享方法get(),set(string)和trace(mode, callback).callback作为第二个参数传递的函数传递了trace(mode, callback)四个参数,self, n, m, x.

BooleanVar()这些似乎是一个例子'', 'PYVAR0', 'w'.

第三个参数x似乎是触发跟踪的模式,在我的情况下,变量已更改.但是,第一个看似空字符串的变量是什么?什么是第二个,如果我不得不猜测我会说变量的内部名称?

Bry*_*ley 26

第一个参数是内部变量名称.在tkinter上下文中或多或少没用,但对底层tcl解释器非常有用.

如果第一个参数表示一个列表变量(在tkinter中不太可能),则第二个参数将是该列表的索引.如果是缩放器变量,则第二个参数将是空字符串.

第三个参数是操作,如果您使用相同的方法读取,写入和/或删除变量,则非常有用.此参数告诉您哪个操作触发了回调.写入操作(设置变量)和"r"用于读取操作(获取变量的值)将为"w".如果变量被删除则为"u"("u"为"未设置"的缩写)

Tkinter是一个围绕tcl/tk解释器的python包装器.可以在此处找到变量跟踪的权威文档:http://tcl.tk/man/tcl8.5/TclCmd/trace.htm#M14.虽然,这仅记录了内部跟踪的工作原理,但tkinter包装器有时会对数据进行按摩.

  • 如果trace回调是类实例中的方法,则第一个参数超级有用。在这种情况下,第一个参数指向类实例。在其他情况下,回调的“作用域”可能导致第一个参数非常有用。 (2认同)
  • 我忘了提及,如果您在创建变量时为变量指定了名称(使用“name”关键字),则该名称将作为回调的第一个参数传递,而不是不太有用的通用 tkinter 名称。如果需要,这使您可以更轻松地跨多个变量共享回调函数。和。如果您有动力,您可以使用该名称直接访问变量,也许可以通过将变量存储在字典中,尽管我不确定这会给您带来麻烦。 (2认同)

小智 11

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

someVar = IntVar(name="Name of someVar")
Run Code Online (Sandbox Code Playgroud)

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

  • 在提供有用信息的同时,这不是OP问题的答案.根据@Bryan Oakley的回答,适当的地方是评论. (3认同)
  • 如果它包含让我按名称检索变量的tkinter函数,则此答案将更加有用。“ nametowidget()”成员函数似乎只了解小部件(由其名称暗示)。 (2认同)