Python - 从Tkinter回调返回

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - 从Tkinter回调返回相关的知识,希望对你有一定的参考价值。

如何从作为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.partiallambda。这两个在需要时很好,但是如果你使用面向对象的编码风格,它们通常是不必要的,并导致代码比它需要的更难维护。

例如:

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)
另一答案

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

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

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

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变量中。它还具有以下优点:您可以根据需要为按钮运行的函数使用尽可能多的参数。

另一答案

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

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

def someFxn(): your code

然后在你的函数中调用var.get(),进行计算,然后对值进行操作。

以上是关于Python - 从Tkinter回调返回的主要内容,如果未能解决你的问题,请参考以下文章

Tkinter 回调异常:matplotlib 动画

tkinter 按钮回调中的 Lambda 函数

如何从widget的函数返回值,并将其传递给Tkinter,Python中的另一个小部件的函数

Tkinter 字符串回调

片段:按下返回按钮并自定义它时调用哪个回调

使用 SHAP 的 Tkinter 回调异常