PySimpleGUI Table 元素。如何读取选定的行?

PySimpleGUI Table element. How to read a selected row?

我是 Python 的初学者,在 PySimpleGui 上更是初学者,我非常喜欢使用它来创建带有 GU 界面的小应用程序。我遇到的问题是关于 table 元素的。到目前为止,我设法用来自 sqlite 数据库的数据填充了 table 元素。一旦 table 准备好数据,我就可以突出显示特定的行。由于我不知道由 table 元素触发的任何事件,所以我放置了一个按钮,一旦选择了一行就可以单击它,然后执行与单击事件关联的代码。 Table 就绪,选择行,单击按钮,现在,如何获取整行值?我尝试了“values['mytable']”,但结果有点像 table 索引。我想要一个值列表。可能吗 ?感谢您的帮助。

布局:

data_values = []
data_headings = ['File ID', 'Type', 'Description', 'Remarks']
data_values.append(['', '', '', ''])
data_cols_width = [5, 8, 35, 35]
tab5_layout = [

[sg.Table(values=data_values, headings=data_headings,
                            max_col_width=65,
                            col_widths=data_cols_width,
                            auto_size_columns=False,
                            justification='left',
                            num_rows=6, key='_filestable_')],
    
[sg.Button('Select Row', key='_rowselected_')]

事件:

if event == '_rowselected_':
    te1 = values['_filestable_']
    print('Event triggered : ', te1)

给你:

单击按钮后,这将为您提供所选行的值。

# --- EVENT LOOP ---
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    if event == '_rowselected_':
        print(data_values[values['_filestable_']])

在 PySimpleGUI 中处理以前未使用过的元素时,查看项目提供的一些材料会很有帮助。

一个是演示程序。这些旨在让您快速开始使用功能。另一个是调用参考文档。您可以通过文档字符串访问相同的信息(使用 PyCharm 时按 Control+Q)。

I am not aware of any event triggered by the table element

如果一个元素能够产生事件并且默认情况下不这样做(如按钮或菜单),那么您将找到一个参数 enable_events

对于 Table 元素,您会发现文档字符串(以及调用参考)具有 table 元素的参数:

enable_events – Turns on the element specific events. Table events happen when row is clicked

在您的示例中,您需要做的是将此参数添加到布局中的 Table。

[sg.Table(values=data_values, headings=data_headings,
                            max_col_width=65,
                            col_widths=data_cols_width,
                            auto_size_columns=False,
                            justification='left',
                            enable_events=True,
                            num_rows=6, key='_filestable_')],

编辑:

我喜欢提供教如何解决问题的答案,而不是脱口而出答案。这不仅会在这种情况下对您有所帮助,在使用 PySimpleGUI 包时也会对您有所帮助。

让我们再深入一步,了解 Tables 的值条目是如何工作的。

Tables 的值字典中的条目是 selected.

行的列表

如果您看到这样的构造,请小心:

data_values[values['_filestable_']]

因为它不会 运行。它会崩溃。

这些值不能用于直接在源 table 中查找值。尝试这样做会产生列表索引必须是整数或切片的错误。

由于在此示例中已为 table 启用了事件,您可以在事件循环中检查事件并适当地处理事件:

if event == '_filestable_':
    data_selected = [data_values[row] for row in values[event]]

data_selected 将是原始数据行的列表。

如果您希望限制您的用户一次只能 select 一行,那么您可以在创建 table.[=21= 时设置 select_mode 参数]

select_mode=sg.TABLE_SELECT_MODE_BROWSE

浏览将允许单行而不是默认的多行。使用 BROWSE 设置的 select 模式,您可以假设您的 data_selected 列表只有 1 个条目,因此 data_selected[0] 将是那个条目。或者您可以使用 data_selected[0] 仅获取第一行 selected.

最后一句话...

PySimpleGUI 文档有一个关于支持的部分,该部分首先解释了不推荐使用 SO 等网站。建议出于多种原因避免这些,包括基本缺乏知识。对于几乎所有 GitHub 个活跃的项目,提交该项目的 Issue 往往会提供高质量的答案。大多数开发人员都想提供帮助并想知道可能意味着文档不清楚的问题或常见问题。

祝你的程序好运!希望一切顺利。