python - Tkinter lambda 函数

标签 python lambda tkinter

<分区>

(如“家庭作业”标签所示,这是计算机科学项目的一部分。)

我正在使用 tkinter 在 Python 中编写Jeopardy! 模拟,我遇到了一个关于在按钮中使用 lambda 函数的大问题。假设 root = Tk()categories 是一个列表。

# Variable to keep the buttons
root._buttons = {}

# Display headers on top of page
for i in range(5):
    # Get category name for display in main window
    name = categories[i]
    b = Label(root, text=fill(name.upper(), 10), width=18, height=3,\
        bg="darkblue", fg="white", font=("Helvetica bold", "", 11))
    b.grid(row=0, column=i)

    # Create list of buttons in that variable (root._buttons)
    btnlist = [None]*5

    # Display individual questions
    for j in range(5):

        # Make a button for the question
        b = Button(root, text="$" + str(200 * (j+1)), width=8, height=1,
            bg="darkblue", fg="orange", font=("Impact", "", 30))
        b.cat = name
        b.value = 200 * (j + 1)
        b.sel = lambda: select(b.cat, b.value)

        # Add callback event to button
        print(b.cat, b.value, b.sel)
        b.config(command=b.sel)

        # Add button to window
        b.grid(row=j+1, column=i)

        # Append to list
        btnlist[j] = b

    root._buttons[categories[i]] = btnlist

有关所有代码,请参阅 my little Code Viewer (under construction!)

问题似乎出现在 lambda: select(b.cat, b.value) 处,因为当我单击面板上的任何按钮时,它总是转到最后一个按钮董事会。我尝试过其他方法,不幸的是所有方法都使用 lambda,而且我还没有看到任何不涉及 lambda 的方法。

最佳答案

改变

lambda: select(b.cat, b.value)

lambda b = b: select(b.cat, b.value)

在您的原始代码中,b 不是 lambda 的局部变量;它位于封闭范围内。 for-loop 完成后,b 保留它的最后一个值。这就是 lambda 函数都使用最后一个按钮的原因。

如果您将 lambda 定义为采用一个带有默认值的参数,则默认值在 定义 lambda 时确定(并固定)。现在 blambda 的局部变量,当不带参数调用 lambda 时,Python 将 b 设置为默认值,这很高兴根据需要设置为各种不同的按钮。

关于python - Tkinter lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11005401/

相关文章:

python - Flask-login:如果 login_manager 的 session_protection 设置为 "strong",请记住我不工作

c# - lambda 表达式树的空检查

C++ 泛型 lambdas : pattern type deduction

java - 如何使用 java lambda 流 :Given a list of students having books, 查找所有正在阅读最便宜书籍的学生

python-3.x - tkinter,如何获取Entry小部件的值?

python - 如果有很多小部件,则使按钮向左对齐

python - Tensorflow:如何使 tf.unique 的返回值与输入的大小相同

python - 未定义谷歌应用引擎 get_serving_url()

python - tkinter-连接到文本小部件的滚动条可见,但没有任何 slider 。

python - 具有 side_effect 的模拟类属性