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可能是错误的想法,但我需要知道正确的想法是什么。提前感谢任何答案!
答案 0 :(得分:1)
return
lambda
函数隐式return
是已计算表达式的值,因此显式使用return
是多余的,并且(正如您所发现的)在Python中是非法的。
因此,lambda
功能:
lambda: "foo"
相当于:
def equivalent_function():
return "foo"
如果您只想将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())