5

如何从作为 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)吗?

4

3 回答 3

9

从回调“返回”值的概念在事件驱动程序的上下文中没有意义。回调作为事件的结果被调用,因此无处可返回值。

作为一般的经验法则,你的回调应该总是调用一个函数,而不是使用functools.partialor 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)
于 2012-08-10T18:55:47.307 回答
7

很抱歉迟到了 6 年,但最近我想出了一个很好的方法来做到这一点,而不会让你的代码变得混乱和难以维护。这几乎就是DaveTheScientist所说的,但我只是想稍微扩展一下。通常,在 Tkinter 中,如果你想让一个按钮调用一个函数,你可以执行以下操作:

exampleButton = Button(root, text = 'Example', command = someFunc)

someFunc只要按下按钮,这将简单地调用。但是,如果此函数接受参数,则需要使用 lambda 并执行以下操作:

exampleButton = Button(root, text = 'Example', command = lambda: someFunc(arg1, arg2))

上面的代码行将运行someFunc并使用变量arg1arg2作为该函数的参数。现在,你可以在一个程序中做的是,很多时候,你需要按钮运行的函数来返回值,就是创建一个由每个按钮调用的新函数。

此函数将您希望按钮运行的函数作为第一个参数,然后是该函数的参数。

def buttonpress(function, *args):
    value = function(*args)

然后,当您创建按钮时,您可以:

exampleButton = Button(root, text = 'Example', command = lambda: buttonpress( someFunc, arg1, arg2 ))

这将运行给定的函数(在本例中为someFunc)并将返回值存储在value变量中。它还有一个优点,即您可以为按钮运行的功能使用任意数量的参数。

于 2018-03-03T14:06:26.460 回答
0

只需创建一个由您的按钮调用的实际函数,而不是像那样将其全部内联。

button=Tk.Button(parent, text='click', command=someFxn)

def someFxn(): your code

然后在你的函数中调用 var.get(),进行计算,然后对值做一些事情。

于 2012-08-10T18:02:01.737 回答