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

PySimpleGUI表格日期范围过滤器TypeError报错修复求助

PySimpleGUI表格日期过滤报错修复:TypeError: list indices must be integers or slices, not str

报错信息

Traceback (most recent call last):
  File "c:\Python\Lib\KW-APP-FINAL.py", line 285, in <module>
    filtered_td = filter_data(date_from, date_to, td)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Python\Lib\KW-APP-FINAL.py", line 46, in filter_data
    date = datetime.datetime.strptime(item['Дата'], '%Y-%m-%d %H:%M:%S').date()
                                      ~~~~^^^^^^^^
TypeError: list indices must be integers or slices, not str

问题场景

在PySimpleGUI表格应用中实现日期范围过滤功能时触发上述错误,相关代码如下:

过滤函数代码

def filter_data(date_from, date_to, td):
    filtered_td = []
    for item in td:
        date = datetime.datetime.strptime(item['Дата'], '%Y-%m-%d %H:%M:%S').date()
        if date_from <= date <= date_to:
            filtered_td.append(item)
    return filtered_td

事件循环代码

elif event == 'Покажи':
                date_from = values['-DATE_FROM-']
                date_to = values['-DATE_TO-']

                if date_from and date_to:
                    try:
                        date_from = datetime.datetime.strptime(date_from, '%Y-%m-%d %H:%M:%S').date()
                        date_to = datetime.datetime.strptime(date_to, '%Y-%m-%d %H:%M:%S').date()

                        filtered_td = filter_data(date_from, date_to, td)

                        window['-TABLE-'].update(values=filtered_td)
                    except ValueError:
                        sg.popup('Въвели сте неправилен формат на дата. Моля използвайте ГОДИНА-МЕСЕЦ-ДЕН!')
                else:
                    sg.popup('Моля въведете начална и крайна дата!')

修复方案

错误根源

你传入filter_data的td变量,其中的元素是列表而非字典。PySimpleGUI表格的values参数要求的是「列表的列表」格式(每一行是一个包含各列值的列表),而非字典列表,所以用item['Дата']这种字典键取值的方式会触发类型错误。

具体修复步骤

  1. 确认日期列的索引位置
    先打印td中某一行的结构,确认日期所在的索引:

    # 在调用filter_data前添加打印,或者在filter_data函数内添加
    print(td[0])  # 输出第一行的结构,比如可能是['2024-01-01 10:00:00', '其他字段值', ...]
    

    假设日期是第0列(第一个元素),索引就是0,请根据实际列顺序调整。

  2. 修改过滤函数
    把item['Дата']改成对应索引的取值,比如日期在第0列:

    def filter_data(date_from, date_to, td):
        filtered_td = []
        for item in td:
            # 替换成你实际的日期列索引
            date_str = item[0]
            date = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').date()
            if date_from <= date <= date_to:
                filtered_td.append(item)
        return filtered_td
    
  3. 额外验证(可选)
    如果运行后仍报错,检查日期字符串的格式是否和strptime中的'%Y-%m-%d %H:%M:%S'完全匹配,比如是否存在多余空格、不同分隔符等问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:15:23