Python - 从Tkinter回调返回

问题描述 投票:4回答:3

如何从作为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),这可以克服吗?

python callback tkinter return
3个回答
8
投票

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

作为一般的经验法则,你的回调应该总是调用一个函数,而不是使用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)

3
投票

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


0
投票

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

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

def someFxn(): your code

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

© www.soinside.com 2019 - 2024. All rights reserved.