如何获取按钮以获得返回功能的功能?

时间:2014-03-13 18:26:48

标签: python lambda tkinter

Python有一个非常有用的lambda函数,我在一个按钮中使用它,但我需要它,这样当按下按钮时它会使main函数返回一个字符串(或布尔值),让我们说True。

以下是一个示例代码:

from tkintet import *

def buttonwindow():
    tk = Tk()
    button = Button(tk, text = "Press Me!", commmand = lambda : return True)
    button.pack() 
print (buttonwindow())

但在它甚至可以打印之前,Python表明在单词return的末尾代码中存在错误。我想这可能是因为return True正在为lambda这样做(我不想要它,因为我需要buttonwindow()而不是lambda来返回True),也许是一个函数lambdas做不到。

有谁知道我怎么能得到它以便buttonwindow()返回true。我已经尝试过不使用lambda(例如:...command = return True)也失败了。使用lambdas可能是错误的想法,但我需要知道正确的想法是什么。提前感谢任何答案!

2 个答案:

答案 0 :(得分:1)

为什么在return

处出现“错误”

lambda函数隐式return是已计算表达式的值,因此显式使用return是多余的,并且(正如您所发现的)在Python中是非法的。

因此,lambda功能:

lambda: "foo"

相当于:

def equivalent_function():
    return "foo"

如何将“True”打印到stdout

如果您只想将True打印到stdout,则可以执行以下操作:

def my_callback():
    print(True)

button = Button(tk, text="Press Me!", command=my_callback)

如果你使用的是Python 3.x,那么print只是一个常规函数,用括号调用,你可以使用lambda函数没有问题:

button = Button(tk, text="Press Me!", command=lambda: print(True))

但是,如果您使用的是Python 2.x,print语句(如return),并且在lambda函数中使用它将提出错误。您可以在Python 2.x中使用Python 3.x print 函数,方法是在脚本顶部包含以下导入:

from __future__ import print_function

答案 1 :(得分:1)

你似乎要问的核心问题是“有谁知道我怎么能得到它,以便buttonwindow()返回true”

答案是更好地了解tkinter如何工作,然后使用该知识制定解决方案。通过弄清楚如何让lambda返回true,你无法到达那里。问题比几行代码可以解决的问题要深刻得多。

如果您正在尝试创建一个打开窗口并在返回前等待用户输入的函数,则需要执行一些操作。首先,您需要确保在创建窗口小部件后运行事件循环。然后,您需要创建一个回调函数,该函数将值设置为main函数可访问的某个位置。接下来,您需要让回调函数在用户输入数据后停止事件循环。最后,您需要获取该数据并在事件循环停止后返回它。

最简单的方法是创建一个类,以便您可以使用实例变量来传递数据。以下是一个工作示例:

import tkinter as tk

class Example(object):
    def __init__(self):
        self.value = None
        self.root = None

    def show(self):
        '''Show the window, and wait for the user to click a button'''

        self.root = tk.Tk()
        true_button = tk.Button(self.root, text = "True", 
                                command= lambda: self.finish(True))
        false_button = tk.Button(self.root, text = "False", 
                                 command= lambda: self.finish(False))

        true_button.pack()
        false_button.pack()

        # start the loop, and wait for the dialog to be
        # destroyed. Then, return the value:
        self.root.mainloop()
        return self.value

    def finish(self, value):
        '''Set the value and close the window

        This will cause the show() function to return.
        '''
        self.value = value
        self.root.destroy()


print("getting ready to show dialog...")
print("value:", Example().show())