如何使用Tkinter获取输入框数据并写入Pandas DataFrame?
解决Tkinter输入写入Pandas DataFrame的问题
你的代码存在两个核心问题:
- 变量作用域问题:
enterbtn函数内重新赋值dataFrame时,会创建一个局部变量,无法修改全局的DataFrame对象 - Pandas方法弃用:
append方法已在Pandas 2.0及以上版本中被弃用,推荐使用pd.concat或df.loc来添加行数据
修正后的完整代码
import pandas as pd import tkinter as tk # 创建窗口 window = tk.Tk() window.title("Entry Form") window.geometry("600x600") # 初始化Pandas数据集 myData = { "date": [3], "temperature": [3] } dataFrame = pd.DataFrame(myData) def enterbtn(): # 声明使用全局的dataFrame变量 global dataFrame date = dateEntry.get() temperature = tempEntry.get() # 方案1:使用pd.concat添加新行(兼容新版Pandas,推荐) new_row = pd.DataFrame({"date": [date], "temperature": [temperature]}) dataFrame = pd.concat([dataFrame, new_row], ignore_index=True) # 方案2:使用loc直接在末尾添加行(无需创建新DataFrame) # dataFrame.loc[len(dataFrame)] = {"date": date, "temperature": temperature} window.destroy() print(dataFrame) # GUI组件布局 tk.Label(window, text="请输入温度和日期,谢谢!", font=("Calibri", 20, "bold")).grid(column=0, row=0, columnspan=2) tk.Label(window, text="温度:", font=("Calibri", 10)).grid(column=0, row=1, sticky="e") tempEntry = tk.Entry(window, font=("Calibri", 10)) tempEntry.grid(column=1, row=1, sticky="w") tk.Label(window, text="日期:", font=("Calibri", 10)).grid(column=0, row=2, sticky="e") dateEntry = tk.Entry(window, font=("Calibri", 10)) dateEntry.grid(column=1, row=2, sticky="w") button1 = tk.Button(window, text="提交", font=("Calibri", 10), command=enterbtn) button1.grid(column=0, row=3, columnspan=2) # 启动窗口 window.mainloop()
关键说明
- 全局变量声明:在
enterbtn函数开头添加global dataFrame,确保函数内修改的是全局的DataFrame对象,而非局部变量 - 替换append的方案:
pd.concat:将原DataFrame与新行组成的小DataFrame合并,ignore_index=True可重置索引,避免索引重复df.loc[len(dataFrame)]:直接在DataFrame末尾插入一行,无需额外创建新对象
- 输入类型优化:如果需要将温度转为数值类型,可添加
temperature = float(tempEntry.get()),避免存储字符串格式的数值
内容的提问来源于stack exchange,提问作者Paul Kellermann
相关产品推荐
相关产品推荐

