【问题标题】:Tkinter - variable to trace change in other variableTkinter - 跟踪其他变量变化的变量
【发布时间】:2015-04-08 15:11:18
【问题描述】:

所以我有这个代码sn-p:

for p in self.ProductNames:
    OptionMenuVar = StringVar()
    menu = OptionMenu(self.FrameProducts, OptionMenuVar, *self.ProductNames)
    OptionMenuVar.set(p)

    AgeVar = StringVar()
    AgeEntry = Entry(self.FrameProducts,width=15,textvariable=AgeVar,state="readonly",justify=CENTER)

生成此 UI:

问题

如何跟踪OptionMenuVar 的变化并根据所选值更新AgeVar

我读过The Variable Classes。我想我知道如何跟踪 OptionMenuVar 中的更改,但我仍然不知道如何:

  1. 检测新值
  2. 根据新值更新AgeVar

【问题讨论】:

  • 您可以通过StringVar 对象的trace() 方法在其值更改时调用某个函数。在你的情况下OptionMenuVar.trace("w", mycallback)。见The Variable Classes (BooleanVar, DoubleVar, IntVar, StringVar)"w"mode,表示“写入”时调用。
  • 是的。已经知道这种方法了。只是不知道如何应用它:)
  • 刚刚想通了...
  • 编写一个函数,调用时获取OptionMenuVar的当前值并设置AgeVar的值。
  • 很难阅读您的代码,因为您的变量名没有遵循PEP 8 - Style Guide for Python Code,因为它们使用了 CapWords(又名 CamelCase),所以看起来都像类名。跨度>

标签: python callback tkinter observers


【解决方案1】:

所以这是这样做的方法:

def OnOptionMenuChnage(omv,av, *pargs):
    print omv.get(), av.get()
    # do more. set av value based on omv value

OptionMenuVar.trace("w", lambda *pargs: OnOptionMenuChnage(OptionMenuVar,AgeVar, *pargs))

完整代码

for p in self.ProductNames:
    OptionMenuVar = StringVar()
    menu = OptionMenu(self.FrameProducts, OptionMenuVar, *self.ProductNames)
    OptionMenuVar.set(p)

    AgeVar = StringVar()
    AgeEntry = Entry(self.FrameProducts,width=15,textvariable=AgeVar,state="readonly",justify=CENTER)

    def OnOptionMenuChnage(omv,av, *pargs):
        print omv.get(), av.get()
        # do more. set av value based on omv value

    OptionMenuVar.trace("w", lambda *pargs: OnOptionMenuChnage(OptionMenuVar,AgeVar, *pargs))

感谢 Marcin answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多