如何获取Tkinter循环生成的输入表格中的用户填写值?
问题解决:Tkinter表格获取值全为空的修复
核心问题
你当前代码的问题在于创建Entry组件的瞬间就调用了.get()方法,此时用户还未输入任何内容,所以返回的列表自然全是空字符串。同时全局变量t、m的使用也不够规范,容易引发逻辑混乱。
修复方案
1. 重构Tbl类,延迟取值时机
不再在创建Entry时立刻获取值,而是保存所有Entry组件的引用,新增一个专门的方法,在需要时(比如用户点击提交按钮后)统一获取输入内容。同时将t、m作为参数传入Tbl类,消除全局变量依赖。
修改后的代码
重构后的Tbl类:
class Tbl(tk.Frame): def __init__(self, root=None, t=0, m=0): tk.Frame.__init__(self, root) self.t = t self.m = m self.entries = {} # 保存所有Entry组件的引用 self.create_widgets() def create_widgets(self): con = 0 for i in range(self.t + 1): for j in range(self.m + 1): if i == 0: if j == 0: el = tk.Label(self, text=" ") el.grid(row=i, column=j) else: el = tk.Label( self, text=f"M{j}", width=5, borderwidth=1, relief="solid", font=('Arial',14,'bold'), justify="center" ) el.grid(row=i, column=j) else: if j == 0: el = tk.Label( self, text=f"T{i}", width=5, borderwidth=1, relief="solid", font=('Arial',14,'bold'), justify="center" ) el.grid(row=i, column=j) else: self.entries[con] = tk.Entry( self, width=5, borderwidth=1, relief="solid", fg='black', font=('Arial',16,'bold'), justify="center" ) self.entries[con].grid(row=i, column=j) con += 1 def get_table_values(self): # 专门用于获取表格内容的方法 mat = [] for entry in self.entries.values(): mat.append(entry.get().strip()) # 去除输入内容首尾空格 return mat
修改调用Tbl的createTable方法:
def createTable(self): t = int(self.controller.tNb) m = int(self.controller.mNb) global tabl tabl = Tbl(self, t=t, m=m) tabl.place(relx=0.3, y=150)
2. 如何获取用户输入值
当需要获取表格内容时(比如绑定到按钮点击事件),调用tabl.get_table_values()即可,示例:
# 示例:点击按钮后获取表格内容 def on_submit(self): user_inputs = tabl.get_table_values() print(user_inputs) # 输出用户填写的所有内容
可选:使用textvariable的正确方式
如果坚持使用textvariable,需要确保每个Entry对应的StringVar被保存(避免被Python垃圾回收机制回收),修改Tbl类的部分代码如下:
class Tbl(tk.Frame): def __init__(self, root=None, t=0, m=0): tk.Frame.__init__(self, root) self.t = t self.m = m self.vars = {} # 保存所有StringVar对象 self.create_widgets() def create_widgets(self): con = 0 # 标签创建代码与之前一致,省略... else: var = tk.StringVar() self.vars[con] = var entry = tk.Entry( self, width=5, borderwidth=1, relief="solid", fg='black', font=('Arial',16,'bold'), justify="center", textvariable=var ) entry.grid(row=i, column=j) con += 1 def get_table_values(self): mat = [] for var in self.vars.values(): mat.append(var.get().strip()) return mat
关键总结
- 延迟取值时机:必须等用户完成输入后,在触发事件(如按钮点击)时调用取值方法。
- 消除全局变量:将参数传入类,提升代码的健壮性和可维护性。
- 保存组件/变量引用:确保后续需要时能访问到Entry或其对应的文本变量。
内容的提问来源于stack exchange,提问作者User124
相关产品推荐
相关产品推荐

