为何Tkinter中使用grid()布局时无法调用get()方法?
Tkinter grid布局后Entry.get()失效的修复方法
核心问题不是grid()布局和get()不兼容,而是你写代码时犯了一个Tkinter常见语法错误:把控件创建和布局方法链式调用了。
Tkinter的grid()、pack()、place()这三个布局方法的返回值都是None。当你写e1 = Entry(window).grid(row=1, column=2)时,e1实际被赋值为None,而非Entry控件的实例对象。之后调用e1.get(),本质是在None对象上调用方法,必然会报错导致功能失效。
而pack()布局能正常运行,是因为你拆分了控件创建和布局的步骤:先通过e1 = Entry(window)获取到有效的Entry实例,再单独调用e1.pack()布局,所以e1始终指向正确的控件对象。
修复后的grid布局代码
from tkinter import * def function1(): ci = e1.get() print(ci) # 修正原代码中变量名写错的问题(ci写成了c1) window = Tk() # 拆分控件创建与布局:先实例化控件并赋值给变量,再调用grid() e1 = Entry(window) e1.grid(row=1, column=2) # 修正原代码中函数名不匹配的问题(command指向的read_input_field未定义,实际是function1) # 同时调整按钮的行号,避免和输入框重叠 b1 = Button(text="Ok", command=function1) b1.grid(row=2, column=2) window.mainloop()
额外注意点
- 养成拆分控件创建和布局代码的习惯,避免链式调用导致的对象丢失问题
- 注意检查代码中的变量名、函数名拼写,原代码里还存在
function1和read_input_field不匹配、ci和c1拼写错误的问题,这些也会导致代码运行异常
内容的提问来源于stack exchange,提问作者tron
相关产品推荐
相关产品推荐

