如何从作为 Tkinter 回调执行的函数中获取返回的对象?
import Tkinter as Tk
from functools import partial
def square(x):
return x*x
root = Tk.Tk()
var = Tk.IntVar(root, value=0) #the variable the gets passed to the class call
menu = Tk.OptionMenu(root, var, *[0,1,2,3,4,5]) #a drop-down list to choose a value for the variable
menu.pack()
button = Tk.Button(root, text='click', command = partial(square,var.get())) #a button that calls the class
button.pack()
root.mainloop()
显然这是一个简化的例子。实际上,按钮调用的函数将返回对象,我希望将其附加到将保存在主 Python 命名空间中以进行进一步操作的对象列表中。
无论如何,在这里用户可以使用 GUI 选择函数的参数,然后按下将执行该函数的按钮。然而,该函数的返回值似乎注定会丢失在以太中,因为回调不会接受返回。可以在不使用丑陋的情况下克服这个问题吗?global
在定义中square(x)
?
从回调“返回”值的概念在事件驱动程序的上下文中没有意义。回调作为事件的结果被调用,因此没有地方可以返回值。
作为一般经验法则,您的回调应始终调用函数,而不是使用functools.partial
or lambda
。当需要时,这两者都很好,但如果您使用面向对象的编码风格,它们通常是不必要的,并且会导致代码比需要的更难维护。
例如:
def compute():
value = var.get()
result = square(value)
list_of_results.append(result)
button = Tk.Button(root, text='click', command = compute)
...
如果将应用程序创建为类,这会变得容易得多,并且可以避免全局变量:
class App(...):
...
def compute():
...
result = self.square(self.var.get())
self.results.append(result)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)