Kivy中TextInput转Pandas DataFrame写入Excel对象地址问题求助
问题分析与解决方案
我一眼就看出你代码里的问题啦!你之所以得到对象内存地址而非实际输入内容,核心原因是你直接操作了Kivy的TextInput控件对象,而没有获取它的实际输入文本(.text属性),另外DataFrame的构造逻辑也不符合表格存储的常规需求。
具体问题点拆解
- 错误1:构造字典键时,你用了
str(self.first_name)和str(self.last_name)——这是把TextInput控件对象本身转成字符串,Kivy控件默认的字符串表示就是它的内存地址,所以你的列名变成了一堆类似<kivy.uix.textinput.TextInput object at 0x...>的无效内容。 - 错误2:字典的值你用了
self.level——同样是把TextInput控件对象存进去了,而不是用户输入的self.level.text。 - 错误3:DataFrame的结构设计不合理,你把姓名组合作为列名、等级作为值,这不符合常规的学生信息表格结构(应该是字段作为列,每条记录作为行)。
修正后的代码
下面是修改后的MainWindow类,重点修正了btn方法:
from kivy.app import App from kivy.app import Builder from kivy.uix.screenmanager import ScreenManager, Screen from kivy.properties import ObjectProperty import pandas class MainWindow(Screen): first_name = ObjectProperty(None) last_name = ObjectProperty(None) level = ObjectProperty(None) def btn(self): # 1. 获取用户输入的实际文本内容,strip()清理前后空格 first_name = self.first_name.text.strip() last_name = self.last_name.text.strip() level = self.level.text.strip() # 确认输入内容 print(f"First: {first_name}, Last: {last_name}, Level: {level}") # 2. 构造符合表格逻辑的字典:字段作为列名,值是包含输入内容的列表 student_data = { 'First Name': [first_name], 'Last Name': [last_name], 'Level': [level] } self.L = pandas.DataFrame(student_data) # 清空输入框 self.first_name.text = '' self.last_name.text = '' self.level.text = '' # 打印验证DataFrame内容 print(self.L) # 3. 优化Excel写入逻辑:支持追加数据,避免覆盖原有内容 try: # 如果文件存在,读取已有数据并追加新记录 existing_df = pandas.read_excel('student_info.xlsx') combined_df = pandas.concat([existing_df, self.L], ignore_index=True) combined_df.to_excel('student_info.xlsx', index=False) except FileNotFoundError: # 文件不存在时直接创建新文件 self.L.to_excel('student_info.xlsx', index=False) class SecondWindow(Screen): pass class WindowManager(ScreenManager): pass kv = Builder.load_file("my2.kv") class MyMainApp(App): def build(self): return kv if __name__ == "__main__": MyMainApp().run()
关键修改说明
- 获取正确的输入内容:通过
.text.strip()获取TextInput的实际输入文本,这才是你需要存入DataFrame的内容,而不是控件对象本身。 - 合理的DataFrame结构:用
First Name、Last Name、Level作为列名,每个列对应一个包含输入内容的列表(因为DataFrame的每一列是一个序列),这样每条学生信息会作为一行数据存储。 - 支持追加数据:原来的代码每次会覆盖整个Excel文件,现在新增了异常处理逻辑,如果文件存在就追加新记录,不存在则创建新文件,更符合实际使用场景。
- 干净的Excel输出:写入时加上
index=False,避免把DataFrame的索引列写入Excel,让表格更整洁。
现在运行修改后的代码,点击Submit按钮后,你会看到print(self.L)输出正常的DataFrame内容,Excel文件里也会正确保存学生的信息啦!
内容的提问来源于stack exchange,提问作者NotmyName
相关产品推荐
相关产品推荐

