如何让按钮调用一个返回值的函数?
Python 有一个非常实用的 lambda 函数,我在一个按钮上使用它,但我需要在按钮被按下时,让主函数返回一个字符串(或者布尔值),比如说 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()
返回 True,而不是 lambda),也许这是一个 lambda 不能做到的功能。
有没有人知道我该如何让 buttonwindow()
返回 True?我已经尝试过不使用 lambda(例如:...command = return True
),但也失败了。使用 lambda 可能不是个好主意,但我需要知道正确的做法是什么。非常感谢任何回答!
2 个回答
为什么在 return
这里会有个“bug”
lambda
函数会自动返回它计算的结果,所以在里面写 return
是多余的,而且(正如你发现的)在 Python 中是非法的。
因此,这个 lambda
函数:
lambda: "foo"
其实和下面这个是一样的:
def equivalent_function():
return "foo"
如何让 "True" 打印到标准输出
如果你只是想把 True
打印到标准输出,你可以这样做:
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
你似乎在问的核心问题是:“有没有人知道怎么才能让buttonwindow()返回true?”
要解决这个问题,首先需要更好地理解tkinter是怎么工作的,然后用这些知识来设计一个解决方案。你不能仅仅通过让lambda返回true来解决这个问题。实际上,问题比几行代码要复杂得多。
如果你想创建一个打开窗口并在用户输入后再返回的函数,你需要做几件事。首先,确保在创建你的控件后运行事件循环。接着,你需要创建一个回调函数,这个函数会把某个值设置到主函数可以访问的地方。然后,回调函数需要在用户输入数据后停止事件循环。最后,你需要获取这些数据,并在事件循环停止后返回它。
最简单的方法是创建一个类,这样你就可以使用实例变量来传递数据。下面是一个可以工作的示例:
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())