You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:35:16