python tkinter button响应函数返回值_Python - 从Tkinter回调返回

在Tkinter中,如何从回调函数获取返回值?示例代码展示了如何使用OptionMenu选择参数并用Button调用函数,但返回值无法直接获取。在事件驱动的程序中,回调函数的返回值概念不适用。解决方案是让回调函数调用另一个函数,存储结果,避免使用全局变量。此外,通过创建类来组织应用,可以更方便地管理和存储结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

How can I get a returned object (or variable, or whatever - they're all basically the same, aren't they) from a function that is executed as a Tkinter callback?

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()

Obviously this is a simplified example. In reality the function called by the button will return objects, which I wish to append to a list of objects that will be held in the main Python namespace for further operations.

Anyway, here the user is able to choose an argument for the function using a GUI, and press a button that will execute the function. The return value of the function, however, seems doomed to be lost to the aether, since the callback won't accept returns. Can this be overcome without the use of an ugly global in the definition of square(x)?

解决方案

The notion of "returning" values from callbacks doesn't make sense in the context of an event driven program. Callbacks are called as the result of an event, so there's nowhere to return a value to.

As a general rule of thumb, your callbacks should always call a function, rather than using functools.partial or lambda. Those two are fine when needed, but if you're using an object-oriented style of coding they are often unnecessary, and lead to code that is more difficult to maintain than it needs to be.

For example:

def compute():

value = var.get()

result = square(value)

list_of_results.append(result)

button = Tk.Button(root, text='click', command = compute)

...

This becomes much easier, and you can avoid global variables, if you create your application as a class:

class App(...):

...

def compute():

...

result = self.square(self.var.get())

self.results.append(result)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值