【问题标题】:How to obtain the row and column of selected cell in PySimpleGUI?PySimpleGUI如何获取选中单元格的行列?
【发布时间】:2021-09-11 09:13:34
【问题描述】:

我有一些表格数据,我想在我的 GUI 中显示。我正在使用 PySimpleGUI。

我正在这个 answer 的基础上构建。

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

表格启用了事件,因此每次点击它都会创建一个带有键值的事件。

while True:
    event, values = window.read()
    if event == "_tracker_":
        print(values["_tracker_"])

我可以用values["_tracker_"]获取点击的行。我也可以得到专栏吗?

基本上,我希望仅当在特定列中单击表格时触发事件,而事件的行是可变的。因此,我认为最好的方法是检查整个表上的事件,而不是根据行和列过滤掉。

如果有完全其他的方法可以做到这一点,我愿意接受建议。

【问题讨论】:

    标签: python user-interface events pysimplegui


    【解决方案1】:

    它可以通过 tkinter 代码工作。

    • event 存储在 element.user_bind_event
    • 查找被元素小部件的方法identify('region', x, y)点击的区域。
    • 通过元素小部件的identify_row(y)方法识别哪一行。
    • 通过元素小部件的identify_column(x)方法识别哪一列。

    这是我的代码。

    import PySimpleGUI as sg
    
    sg.theme("DarkBlue3")
    
    newlist = [[f"Cell ({row+1}, {col+1})" 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, justification='center',)],
        [sg.Text("", size=(50, 1), key='-Position-')]
    ]
    
    window = sg.Window('Table', layout, finalize=True)
    table = window['-TABLE-']
    table.bind('<Button-1>', "Click")
    position = window['-Position-']
    position.expand(expand_x=True)
    
    while True:
        event, values = window.read()
        if event == sg.WIN_CLOSED:
            break
        elif event == '-TABLE-':
            pass
        elif event == '-TABLE-Click':
            e = table.user_bind_event
            region = table.Widget.identify('region', e.x, e.y)
            if region == 'heading':
                row = 0
            elif region == 'cell':
                row = int(table.Widget.identify_row(e.y))
            elif region == 'separator':
                continue
            else:
                continue
            column = int(table.Widget.identify_column(e.x)[1:])
            position.update(f"Table clicked at ({row}, {column})")
    
    window.close()
    

    【讨论】:

    • 谢谢伙计。效果很好。
    • 只有一个问题:为什么还要调用-TABLE-事件?
    • 默认,"&lt;&lt;TreeviewSelect&gt;&gt;"时还有一个事件产生,如果需要选择就给另一个选项,如果不需要可以跳过。基本上,tkinterTreeview 小部件是PySimpleGUITable 元素。
    猜你喜欢
    • 1970-01-01
    • 2019-07-15
    • 2011-10-23
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2012-07-27
    • 2016-11-22
    • 2012-06-05
    相关资源
    最近更新 更多