如何让按钮调用一个返回值的函数?

0 投票
2 回答
2148 浏览
提问于 2025-04-17 22:11

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 个回答

1

为什么在 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
1

你似乎在问的核心问题是:“有没有人知道怎么才能让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())

撰写回答