python-3.x - 在 tkinter 中创建与按钮关联的变量
问题描述
我正在尝试在 Tkinter 中创建一个计算器。尽管我当前的代码可以很好地在每个按钮上创建具有正确编号的按钮,因为该函数仅在创建变量的迭代完成后调用,x 始终为 8,因此所有按钮的值均为 8。我怎么能绕过这个问题?
我尝试不使用 lambda 来调用该函数,但是按钮甚至根本不起作用,我不确定为什么。
下面是基本代码:
from tkinter import *
window=Tk()
ButtonFrame=Frame(window)
ButtonFrame.place(x=100,y=100)
def NumPressed (Digit):
print(Digit)
for y in range(3):
for x in range(3):
NumTXT=y*3+x
Buttonx=Button(ButtonFrame,text=NumTXT,command=lambda:NumPressed(NumTXT))
Buttonx.grid(row=y,column=x)
解决方案
它与 lambda 函数中的默认值有关。按钮全部创建后,NumTXT
变量 == 8。每次按下按钮时,它都会使用 的当前值NumTXT
。
您可以通过为 lambda 函数提供一个不会更改的默认值来解决此问题:
command=lambda x=NumTXT: NumPressed(x)
^
# Set default value
那么每个按钮都会有一个带有默认值的 lambda 函数,就像NumTXT
按钮创建时一样。
推荐阅读
- c# - Fluent Ribbon 未在 Visual Studio 2019 中编译
- html - 如何垂直引导列表组文本
- python - 嵌套列表的最小值/最大值
- node.js - Nodejs找不到包
- c# - ASP.NET Core 3.1 - WebApplicationFactory - WebApplicationFactoryContentRootAttribute 的正确用法是什么?
- css - 带有对齐项的 IE11 flex 包装器禁用 flex 列子项的滚动
- ffmpeg - Chrome 检测到 v4l2loopback 设备,Zoom 或 Firefox 看不到
- plotly - 带有 plotly.express 的 Choropleth 地图不显示地图,只显示图例
- docker - gdbserver 不附加到 docker 容器中正在运行的进程
- vuetify.js - Vuetify 可编辑表