【问题标题】:PySimpleGUI Table element. How to read a selected row?PySimpleGUI 表元素。如何读取选定的行?
【发布时间】:2021-06-17 22:57:50
【问题描述】:

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

布局:

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)

【问题讨论】:

    标签: python pysimplegui


    【解决方案1】:

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

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

    我不知道表格元素触发的任何事件

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

    对于 Table 元素,您会发现文档字符串(因此调用引用也有)具有 table 元素的参数:

    enable_events – 打开元素特定的事件。单击行时会发生表格事件

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

    [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 包时也会对您有所帮助。

    让我们更深入地研究一下表格的值条目是如何工作的。

    表的值字典中的条目是所选行的列表。

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

    data_values[values['_filestable_']]
    

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

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

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

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

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

    如果您希望限制用户一次只能选择 1 行,那么您可以在创建表格时设置 select_mode 参数。

    select_mode=sg.TABLE_SELECT_MODE_BROWSE

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

    最后一句话……

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

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

    【讨论】:

    • @Mike 来自 PSG 虽然这是有关 PySimpleGUI 的有用信息,但这并不是问题的答案。说要阅读文档或演示,或提供更多信息并没有像我那样真正解决最初的问题。
    • @Marcell 接受这个作为答案,当它实际上并没有解决你最初的问题时,恕我直言有点错误。
    • 感谢您的详细描述。我想知道有没有办法同时获取所选单元格的行和列?
    【解决方案2】:

    给你:

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

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

    【讨论】:

    • 正确。它返回为[3],因此您需要提取第 0 个元素来获取值。 print( data_values[ values['_filestable_'][0] ] )
    • @Doyousketch2 没错。我把那部分省略了,因为你可以连续拥有几样东西,你可以选择你想要的。
    • 另外,应该有一种方法可以打破你的事件循环,但这不是重点。 , [ sg.CButton( 'Cancel' ) ]if event == sg.WIN_CLOSED or event == 'Cancel': break
    • @Doyousketch2 再次正确。我没有包括主要问题之外的内容。但是您的评论是正确的,这就是您的做法。事实上,我会把它添加到答案中更加清楚。
    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多