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

4
我是Python的初学者,对于PySimpleGui更是一窍不通。但我很喜欢在创建具有图形用户界面的小应用程序时使用它。我遇到的问题与表元素有关。到目前为止,我成功地从sqlite数据库中填充了表元素的数据。一旦表格准备好了数据,我就可以突出显示特定行。由于我不知道任何由表元素触发的事件,因此我放置了一个按钮,当选择了一行后点击该按钮,然后执行与单击事件相关联的代码。现在,表准备好了,行已选择,按钮已点击,如何获取整个行的值?我尝试过 "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)
2个回答

7

在使用PySimpleGUI中从未使用过的元素时,浏览项目提供的多个材料很有帮助。

其中之一是Demo程序。 这些旨在让您快速了解使用功能。 另一个是调用参考文档。 您可以通过docstrings(在使用PyCharm时按Control + Q)访问此相同的信息。

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

如果元素能够生成事件并且默认情况下没有这样做(例如按钮或菜单),那么您将找到一个名为enable_events的参数。

对于Table元素,您将在docstring(因此也是调用参考文档)中找到表元素的参数:

enable_events-打开特定于元素的事件。 当点击行时发生表事件

在您的示例中,您需要在布局中的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包时不仅在这种情况下,还有其他情况下。

让我们再深入一步了解表格值输入的工作原理。

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

如果您看到以下构造,请小心:

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模式将允许单个行而不是默认的多个行。设置BROWSE的选择模式后,您可以假定data_selected列表只有一个条目,因此data_selected[0]将是该条目。或者,您可以使用data_selected[0]仅获取第一行所选内容。

最后一句话...

PySimpleGUI文档中有关支持的部分开始解释称,不建议使用SO等网站。推荐避免这些网站出于很多原因,包括基础知识的缺乏。对于几乎所有活动的GitHub项目,向该项目提交问题(Issue)往往会提供高质量的答案。大多数开发人员想要帮助和了解问题或常见问题,这可能意味着文档不够清晰。

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


1
@PSG 的 Mike,虽然这是关于 PySimpleGUI 的有用信息,但这并不是问题的答案。告诉别人去阅读文档、演示或提供更多信息,实际上并不能像我的解决方案一样真正解决原始问题。 - akaButters
1
@Marcell 接受这个答案,当它实际上并没有解决你最初的问题,我认为有点不对。 - akaButters
感谢您提供详细的描述。我想知道是否有一种方法可以获取所选单元格的行和列? - Borut Flis

4

请看这里:

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

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


2
没错。它返回 [3],所以您需要提取第0个元素以获取该值。 print(data_values [values ['_filestable _'] [0]]) - Doyousketch2
@Doyousketch2 没错。我忽略了这一部分,因为你可以有多个连续的事物,而你可以选择你想要的。 - akaButters
此外,应该有一种方法可以从事件循环中退出,但这并不是主要问题。, [ sg.CButton( 'Cancel' ) ] 如果 event == sg.WIN_CLOSED 或 event == 'Cancel':break - Doyousketch2
1
@Doyousketch2 再次正确。我没有包括主要问题之外的内容。但是你的评论是正确的,那就是你应该这样做。事实上,我会将其添加到答案中以使其更加清晰明了。 - akaButters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接