如何在PySimpleGUI中获取表格滚动位置并将指定行滚至中间
PySimpleGUI表格滚动位置获取与居中实现
一、获取表格当前滚动位置
PySimpleGUI的Table控件底层封装了tkinter的Treeview,要获取滚动位置需通过Widget属性访问底层控件的方法:
- 调用
window['-TABLE_O-'].Widget.yview(),返回元组(top_ratio, bottom_ratio),其中top_ratio是当前可见区域顶部相对于总行数的比例(0~1),bottom_ratio是底部比例。 - 转换成绝对行号的示例代码:
total_rows = len(window['-TABLE_O-'].Values) yview = window['-TABLE_O-'].Widget.yview() current_top_row = int(yview[0] * total_rows) # 当前可见区域顶部行号 current_bottom_row = int(yview[1] * total_rows) # 当前可见区域底部行号 visible_rows_count = current_bottom_row - current_top_row # 可见行数
二、实现目标行居中显示
要让目标行显示在表格中间,需计算理想滚动位置并做边界限制,步骤如下:
- 获取总行数、目标行号、可见行数;
- 计算理想顶部行:让目标行处于可见区域中间,即
理想顶部行 = 目标行号 - 可见行数//2; - 限制理想顶部行的范围:不能小于0,也不能超过
总行数 - 可见行数(避免底部超出表格范围); - 调用
Widget.see()或yview_moveto()完成滚动。
完整示例代码:
import PySimpleGUI as sg # 构造测试数据 data = [[f"Row {i}", f"Content {i}"] for i in range(150)] total_rows = len(data) layout = [ [sg.Table(data, headings=["行号", "内容"], key="-TABLE_O-", num_rows=12)], [sg.Text("目标行号:"), sg.Input(key="-TARGET-"), sg.Button("滚动到中间")] ] window = sg.Window("表格居中滚动示例", layout) while True: event, values = window.read() if event == sg.WIN_CLOSED: break if event == "滚动到中间": try: target_row = int(values["-TARGET-"]) if not 0 <= target_row < total_rows: continue table_widget = window["-TABLE_O-"].Widget # 获取可见行数 yview = table_widget.yview() visible_rows = int(yview[1] * total_rows) - int(yview[0] * total_rows) # 计算理想滚动位置 ideal_top = target_row - visible_rows // 2 # 边界修正 ideal_top = max(0, min(ideal_top, total_rows - visible_rows)) # 执行滚动 table_widget.see(ideal_top) # 若需更精确的位置控制,可使用yview_moveto: # table_widget.yview_moveto(ideal_top / total_rows) except ValueError: # 输入非数字时忽略 pass window.close()
三、查看控件属性的通用方法
1. 查看PySimpleGUI控件自身属性
直接对控件对象调用dir()函数,可列出所有可用属性和方法:
print(dir(window['-TABLE_O-']))
2. 查看底层tkinter控件属性
通过Widget属性获取底层tkinter控件后,同样用dir()查看:
tk_widget = window['-TABLE_O-'].Widget print(dir(tk_widget))
- 对于tkinter控件,还可以使用
winfo_*系列方法获取窗口相关信息(如winfo_height()获取高度、winfo_width()获取宽度); - 若想了解具体方法的作用,可打印方法的
__doc__属性查看说明:print(tk_widget.yview.__doc__)
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

