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

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值