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

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()

关键修改说明

  1. 获取正确的输入内容:通过.text.strip()获取TextInput的实际输入文本,这才是你需要存入DataFrame的内容,而不是控件对象本身。
  2. 合理的DataFrame结构:用First Name、Last Name、Level作为列名,每个列对应一个包含输入内容的列表(因为DataFrame的每一列是一个序列),这样每条学生信息会作为一行数据存储。
  3. 支持追加数据:原来的代码每次会覆盖整个Excel文件,现在新增了异常处理逻辑,如果文件存在就追加新记录,不存在则创建新文件,更符合实际使用场景。
  4. 干净的Excel输出:写入时加上index=False,避免把DataFrame的索引列写入Excel,让表格更整洁。

现在运行修改后的代码,点击Submit按钮后,你会看到print(self.L)输出正常的DataFrame内容,Excel文件里也会正确保存学生的信息啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:30:07