尝试在我的 pysimplegui 表中创建日期范围过滤器

问题描述 投票:0回答:1

首先祝大家2024年一切顺利! 我试图在我的 PySimpleGUI 表应用程序中创建一个日期范围可排序过滤器,但不幸的是我一直收到此错误:

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

那么有什么想法可以解决这个问题吗? 附:我是 Python 新手,抱歉:)

这是代码:

`

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('Моля въведете начална и крайна дата!')

`

datetime filter jquery-ui-sortable pysimplegui
1个回答
0
投票

这是因为td中的item是一个List,而你想通过a来索引它 字符串“Дата”。也许可以通过

td[Headings.index( 'Дата')]
来完成。

示例代码

from datetime import datetime
import PySimpleGUI as sg

def date(date):
    return datetime.strptime(date, '%m/%d/%Y')

information = [
    ['President',           'Born',       'Died',       'Age'],
    ['George Washington',   '02/22/1732', '12/14/1799', '67'],
    ['John Adams',          '10/30/1735', '07/04/1826', '90'],
    ['Thomas Jefferson',    '04/13/1743', '07/04/1826', '83'],
    ['James Madison',       '03/16/1751', '06/28/1836', '85'],
    ['James Monroe',        '04/28/1758', '07/04/1831', '73'],
    ['John Quincy Adams',   '07/11/1767', '02/23/1848', '80'],
    ['Andrew Jackson',      '03/15/1767', '06/08/1845', '78'],
    ['Martin Van Buren',    '12/05/1782', '07/24/1862', '79'],
    ['William Harrison',    '02/09/1773', '04/04/1841', '68'],
    ['John Tyler',          '03/29/1790', '01/18/1862', '71'],
    ['James Polk',          '11/02/1795', '06/15/1849', '53'],
    ['Zachary Taylor',      '11/24/1784', '07/09/1850', '65'],
    ['Millard Fillmore',    '01/07/1800', '03/08/1874', '74'],
    ['Franklin Pierce',     '11/23/1804', '10/08/1869', '64'],
    ['James Buchanan',      '04/23/1791', '06/01/1868', '77'],
    ['Abraham Lincoln',     '02/12/1809', '04/15/1865', '56'],
    ['Andrew Johnson',      '12/29/1808', '07/31/1875', '66'],
    ['Ulysses S. Grant',    '04/27/1822', '07/23/1885', '63'],
    ['Rutherford B. Hayes', '10/04/1822', '01/17/1893', '70'],
    ['James Garfield',      '11/19/1831', '09/19/1881', '49'],
    ['Chester A. Arthur',   '10/05/1829', '11/18/1886', '56'],
    ['Grover Cleveland',    '03/18/1837', '06/24/1908', '71'],
    ['Benjamin Harrison',   '08/20/1833', '03/13/1901', '67'],
    ['Grover Cleveland',    '03/18/1837', '06/24/1908', '71'],
    ['William McKinley',    '01/29/1843', '09/14/1901', '58'],
    ['Theodore Roosevelt',  '10/27/1858', '01/06/1919', '60'],
    ['William Taft',        '09/15/1857', '03/08/1930', '72'],
    ['Woodrow Wilson',      '12/28/1856', '02/03/1924', '67'],
    ['Warren Harding',      '11/02/1865', '08/02/1923', '57'],
    ['Calvin Coolidge',     '07/04/1872', '01/05/1933', '60'],
    ['Herbert Hoover',      '08/10/1874', '10/20/1964', '90'],
    ['Franklin Roosevelt',  '01/30/1882', '04/12/1945', '63'],
    ['Harry Truman',        '05/08/1884', '12/26/1972', '88'],
    ['Dwight Eisenhower',   '10/14/1890', '03/28/1969', '78'],
    ['John F. Kennedy',     '05/29/1917', '11/22/1963', '46'],
    ['Lyndon Johnson',      '08/27/1908', '01/22/1973', '64'],
    ['Richard Nixon',       '01/09/1913', '04/22/1994', '81'],
    ['Gerald Ford',         '07/14/1913', '12/20/2006', '93'],
    ['Ronald Reagan',       '02/06/1911', '06/05/2004', '93'],
    ['George H.W. Bush',    '06/12/1924', '11/30/2018', '94'],
]

headings = information[0]
data = information[1:]
widths = list(map(max, map(lambda x: map(lambda y:len(str(y))+2, x), zip(*information))))

sg.set_options(font=("Courier New", 12))
layout = [
    [sg.Text("Date (M/D/Y) From"),
     sg.Input(size=10, key="DATE_FM"),
     sg.Text("To"),
     sg.Input(size=10, key="DATE_TO"),
     sg.Button("Filter", expand_x=True)],
    [sg.Table(
        data,
        headings=headings,
        auto_size_columns=False,
        col_widths=widths,
        cols_justification='lccc',
        key='TABLE')],
    [sg.Text("", relief=sg.RELIEF_SUNKEN, expand_x=True, key='STATUS')],
]
window = sg.Window("Table", layout, margins=(0, 0))

while True:

    event, values = window.read()

    if event == sg.WINDOW_CLOSED:
        break

    elif event == "Filter":
        try:
            window['STATUS'].update("")
            date_from = date(values["DATE_FM"])
            date_to   = date(values["DATE_TO"])
        except ValueError:
            window['STATUS'].update("Wrong date !!!")
            continue
        data = [
            [name, born, died, age]
                for name, born, died, age in information[1:]
                    if date_from <= date(born) <= date_to
        ]
        window['TABLE'].update(data)

window.close()

© www.soinside.com 2019 - 2024. All rights reserved.