Tkinter绑定<Return>回车触发getvals提交打印值报错解决
报错原因
Tkinter 中通过bind()绑定的事件触发回调时,会自动向回调函数传入1个event事件对象参数;但你定义的getvals()函数没有设置接收参数的位置,因此触发参数不匹配报错。
而按钮通过command参数绑定回调时,默认不会传入event对象,所以点击按钮调用原函数不会出错。
修复方案
二选一即可:
- 方案1(推荐):修改
getvals函数定义,添加一个默认值为None的可选形参接收event对象,同时兼容按钮点击、回车触发两种调用场景 - 方案2:绑定回车事件时用lambda表达式拦截event参数,不修改原函数定义
代码修改示例
方案1修改片段
修改函数定义:
# 新增event可选形参 def getvals(event=None): print("Submitting form") print(f"{namevalue.get(), phonevalue.get(), gendervalue.get(), emergencyvalue.get(), paymentmodevalue.get(), foodservicevalue.get()} ")
放开回车绑定的注释即可正常运行:
root.bind('<Return>', getvals)
方案2修改片段
不需要改动原getvals函数,将绑定代码替换为如下写法:
root.bind('<Return>', lambda event: getvals())
完整修正后代码
from tkinter import * root = Tk() def getvals(event=None): print("Submitting form") print(f"{namevalue.get(), phonevalue.get(), gendervalue.get(), emergencyvalue.get(), paymentmodevalue.get(), foodservicevalue.get()} ") root.geometry("644x344") #Heading Label(root, text="Welcome to Harry Travels", font="comicsansms 13 bold", pady=15).grid(row=0, column=3) #Text for our form name = Label(root, text="Name") phone = Label(root, text="Phone") gender = Label(root, text="Gender") emergency = Label(root, text="Emergency Contact") paymentmode = Label(root, text="Payment Mode") #Pack text for our form name.grid(row=1, column=2) phone.grid(row=2, column=2) gender.grid(row=3, column=2) emergency.grid(row=4, column=2) paymentmode.grid(row=5, column=2) # Tkinter variable for storing entries namevalue = StringVar() phonevalue = StringVar() gendervalue = StringVar() emergencyvalue = StringVar() paymentmodevalue = StringVar() foodservicevalue = IntVar() #Entries for our form nameentry = Entry(root, textvariable=namevalue) phoneentry = Entry(root, textvariable=phonevalue) genderentry = Entry(root, textvariable=gendervalue) emergencyentry = Entry(root, textvariable=emergencyvalue) paymentmodeentry = Entry(root, textvariable=paymentmodevalue) # Packing the Entries nameentry.grid(row=1, column=3) phoneentry.grid(row=2, column=3) genderentry.grid(row=3, column=3) emergencyentry.grid(row=4, column=3) paymentmodeentry.grid(row=5, column=3) #Checkbox & Packing it foodservice = Checkbutton(text="Want to prebook your meals?", variable = foodservicevalue) foodservice.grid(row=6, column=3) #Button & packing it and assigning it a command Button(text="Submit to Harry Travels", command=getvals ).grid(row=7, column=3) # 绑定回车提交 root.bind('<Return>', getvals) root.mainloop()
内容的提问来源于stack exchange,提问作者Raheel
相关产品推荐
相关产品推荐

