Как вызвать события, нажав на строку в PySimpleGUI

#python #user-interface #datatables #pysimplegui

Вопрос:

Новичок в библиотеке, и, несмотря на работу с демонстрационным кодом, я изо всех сил пытаюсь запрашивать события, нажимая непосредственно на строку таблицы. Я могу легко создать что-то, что позволит пользователю выбрать строку, а затем запустить желаемое событие с помощью кнопки, как показано ниже, но я не уверен, как вырезать шаг кнопки и запустить событие непосредственно при нажатии на строку?

    layout = [[sg.Table(values=df.values.tolist(),
                            headings=df.columns.tolist(),
                            max_col_width=25,
                            auto_size_columns=True,
                            justification='right',
                            # alternating_row_color='lightblue',
                            num_rows=min(len(df), 20))],
              
              
              [sg.Button('Select Row', key='_rowselected_')]]
 

Ответ №1:

Чтобы получить событие нажатия на таблицу, предусмотрено два события

  • Опция enable_click_events для события нажатия на ячейку перед выбранной строкой, поэтому значения[таблица] по-прежнему сохраняют старые данные для выбора.
  • Опция enable_events для события выбора строки, значения[таблица] сохранят данные для нового выбора.

Пример Кода

 import PySimpleGUI as sg

sg.theme("DarkBlue3")

newlist = [
    [f"Cell ({row:0>2d}, {col:0>2d})" for col in range(8)]
        for row in range(10)
]

COL_HEADINGS = ["Date", "Ref", "ID", "Owner", "Customer", "Price", "Size", "Path"]

layout = [
    [sg.Table(
        values=newlist,
        headings=COL_HEADINGS,
        max_col_width=25,
        num_rows=10,
        alternating_row_color='green',
        key='-TABLE-',
        enable_events=True,
        # enable_click_events=True,
        justification='center',
    )],
    [sg.Text("", size=(50, 1), expand_x=True, key='-Position-')]
]

window = sg.Window('Table', layout, finalize=True)
table = window['-TABLE-']
position = window['-Position-']

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    elif isinstance(event, tuple) and event[0:2] == ('-TABLE-', ' CICKED '):
        # click position row, column, count from 0, -1 for headings
        row, col = event[2]
        selection = values['-TABLE-']
        # previous selected row number, not now.
        previous_select_row = selection[0] if selection else 'None'
        position.update(f'Clicked position is ({row}, {col}), and previous selected row is {previous_select_row}')

    elif event == '-TABLE-':
        # selected row number, cound from 0
        row = values[event]
        if row:
            position.update(f'Selected row is {row}')

    print(event, values)

window.close()