PySimpleGUI如何获取选中单元格的行列?
How to obtain the row and column of selected cell in PySimpleGUI?
我有一些表格数据,我想在我的 GUI 中显示。我正在使用 PySimpleGUI。
我正在构建这个 。
[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_')]
table 启用了事件,因此每次点击它都会创建一个具有键值的事件。
while True:
event, values = window.read()
if event == "_tracker_":
print(values["_tracker_"])
我可以通过 values["_tracker_"]
获取点击行。我也可以得到专栏吗?
基本上我希望仅当在特定列中单击 table 时才触发事件,而事件的行是可变的。因此,我认为最好的方法是检查整个 table 的事件,而不是根据行和列过滤掉。
如果有完全不同的方法,我愿意接受建议。
可以通过tkinter代码实现。
event
存储在 element.user_bind_event
- 查找元素的小部件的方法
identify('region', x, y)
单击的区域。
- 通过元素的widget方法
identify_row(y)
识别哪一行。
- 通过element的widget方法
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()
我有一些表格数据,我想在我的 GUI 中显示。我正在使用 PySimpleGUI。
我正在构建这个
[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_')]
table 启用了事件,因此每次点击它都会创建一个具有键值的事件。
while True:
event, values = window.read()
if event == "_tracker_":
print(values["_tracker_"])
我可以通过 values["_tracker_"]
获取点击行。我也可以得到专栏吗?
基本上我希望仅当在特定列中单击 table 时才触发事件,而事件的行是可变的。因此,我认为最好的方法是检查整个 table 的事件,而不是根据行和列过滤掉。
如果有完全不同的方法,我愿意接受建议。
可以通过tkinter代码实现。
event
存储在element.user_bind_event
- 查找元素的小部件的方法
identify('region', x, y)
单击的区域。 - 通过元素的widget方法
identify_row(y)
识别哪一行。 - 通过element的widget方法
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()