Tkinter:如何使用OptionMenu小部件调用函数?

3
我是一个有用的助手,可以翻译您的文本。
我正在制作一个简单的Python-Tkinter应用程序。下面是我目前拥有的代码的简化版本。
from Tkinter import *
root = Tk()

def function(x): 

    if x == "yes":
        a.set("hello")
    else:
        a.set("bye")

#-----------------------------

a = StringVar()
a.set("default")

oc = StringVar(root)
oc.set("Select")
o = OptionMenu(root, oc, "yes", "no", command=function)
o.pack()

z = a.get() 
print z # prints default

root.mainloop()

我希望这段代码能在控制台上打印出“hello”或“bye”,但实际上它会打印“default”。
我一直在尝试让它工作,但是不知何故我无法解决它。如果我直接调用该函数而不使用Optionmenu小部件,则该代码可以正常运行:
z = function("yes")
print z #prints hello

或者:

z = function("no") 
print z #prints bye

有人能解释一下为什么当我使用Optionmenu小部件时它不会打印“hello”或“bye”吗?如何修复它,以便我可以使用变量z而不更改上面的部分?

谢谢!

1个回答

5
from Tkinter import *
root = Tk()

a = StringVar()
a.set("default")

oc = StringVar(root)
oc.set("Select")

def function(x):

  if x == "yes":
      a.set("hello")
      print a.get()

  else:
      a.set("bye")
      print a.get()

o = OptionMenu(root, oc, "yes", "no", command=function)
o.pack()


z = a.get()    
print z

root.mainloop()

当选项菜单选择改变时,OptionMenu现在会执行function -- 如果选项菜单读取"yes",function将以"yes"作为其参数执行,并将a设置为"hello",并为所有其他选项设置a为"bye"。


抱歉,我编辑了我的原始问题,子函数实际上并不是必要的...感谢您的回答!但是,我如何使用Optionmenu小部件将z =“bye”更改为z =“hello”? - Roundhouse
现在就来看看吧。你所需要做的就是根据某些条件设置function以进行更改--它将以当前选定选项作为输入。在函数范围之外,z将始终返回default--因此你需要在函数范围内打印a.get() - JoshieSimmons
那么在函数内部更改了变量a的值后,无法将其赋值给函数外的变量z吗? - Roundhouse
1
你初始化变量 a 并将其设置为 "default"。然后你初始化变量 za.get()。除非你修改 a 的值,否则 a.get() 始终返回 "default"。在 OptionMenu 中,你的帮助函数在更改菜单中的选择器时执行。如果符合条件,它将更改 a 的值。你在定义函数后并在循环结束前分配变量 z。它只会被打印一次,因为它是在你可以更改菜单的设置(也就是更改 a 的值)之前被调用的,所以它始终返回 "default" - JoshieSimmons
啊,现在我明白了,我想如果要进一步计算“hello”/“bye”的值,我必须重新编写我的代码。尽管如此,还是谢谢你的帮助。 - Roundhouse
OptionMenu小部件接受command回调选项的事实非常缺乏文档(如果有的话)。 - martineau

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