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

如何在Tkinter中为多个Entry使用StringVar并追踪其变化

问题解决步骤

1. 修正按钮绑定错误

你的代码里按钮的command=search()会立即执行search函数,而非点击按钮时触发。需去掉括号,直接绑定函数对象:

but = ttk.Button(f2,text="search",command=search)

2. 添加StringVar的变更追踪

要监听用户输入的变化,需给每个StringVar添加trace_add(Python3.6+推荐使用,替代旧版trace),指定触发时机和回调函数。

具体实现:

先定义处理变量变化的回调函数:

def on_var_change(var_index, *args):
    # var_index对应当前行的DataFrame索引,*args为trace自动传递的参数(可忽略)
    new_value = entries[var_index].get()
    print(f"行{var_index}的值更新为: {new_value}")
    # 可选:将更新后的值同步回DataFrame
    df.loc[var_index, "手动输入列"] = new_value

然后在创建StringVar时添加追踪:

for ind in df.index:
    var = tk.StringVar()
    # 绑定追踪:当变量内容被修改时,调用回调函数并传递当前行索引
    var.trace_add("write", lambda *args, idx=ind: on_var_change(idx, *args))
    entries[ind] = var
    # 注意:grid()返回None,若后续需操作Entry组件,需分开创建和布局
    entry = ttk.Entry(f2, textvariable=var, width=25)
    entry.grid(row=ind, column=2)

3. 完整修正后的代码

import pandas as pd
import tkinter as tk
import numpy as np
from tkinter import ttk

entries = {}

df = pd.read_csv(r'C:\Users\Saurabh\Desktop\Python\New folder\abc.csv')
df['Symbol'].replace('  ', np.nan, inplace=True)
df = df.dropna(subset=['Symbol'])
# 新增一列用于存储手动输入的值
df["手动输入列"] = ""

def search():
    for (name, var) in entries.items():   
        print(f"行{name}: {var.get()}")

def on_var_change(var_index, *args):
    new_value = entries[var_index].get()
    print(f"行{var_index}的值更新为: {new_value}")
    # 同步更新至DataFrame
    df.loc[var_index, "手动输入列"] = new_value

f2 = tk.Tk()

for ind in df.index:
    var = tk.StringVar()
    # 添加值变更追踪
    var.trace_add("write", lambda *args, idx=ind: on_var_change(idx, *args))
    entries[ind] = var
    entry = ttk.Entry(f2, textvariable=var, width=25)
    entry.grid(row=ind, column=2)

# 修正按钮绑定
but = ttk.Button(f2, text="search", command=search)
but.grid(row=0, column=3)

f2.mainloop()

关键说明

  • trace_add触发时机:除"write"(内容修改时),还有"read"(变量被读取时)和"unset"(变量被删除时),可按需选择。
  • lambda参数捕获:用lambda *args, idx=ind是为了锁定当前循环的索引值,避免所有回调都引用最后一个索引的问题。
  • Entry布局拆分:entry.grid(...)返回None,若后续需对Entry做设置默认值、禁用等操作,必须先创建对象再调用布局方法。

内容的提问来源于stack exchange,提问作者saurabh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:15:27