PySimpleGUI技术求助:获取TabGroup内表格点击行的数据
PySimpleGUI表格在TabGroup中点击无响应的解决方法
问题排查
你的代码存在两个核心问题导致表格点击无响应:
- 事件循环中
window_package_table.read()的返回值未正确接收,表格的选中行信息存储在values对象中,必须同时获取event和values才能读取 - 未处理窗口关闭事件,循环会持续阻塞,且事件逻辑覆盖不完整
另外,TabGroup的enable_events=True如果不需要监听Tab切换事件可以移除,避免不必要的事件干扰。
修复方案
- 修正事件循环的读取语句,正确接收
event和values - 针对表格点击事件,通过
values[表格KEY]获取选中行的索引,再从表格原始数据中提取对应行内容并填入输入框 - 添加窗口关闭事件的处理逻辑,确保循环正常退出
修复后的完整代码
import PySimpleGUI as sg # 模拟测试数据,实际使用时替换为你的真实数据 package_data_all = [["套餐1", "100", "基础版"], ["套餐2", "200", "进阶版"]] headings_pakete = ["名称", "原价", "类型"] sell_package_data = [["售卖套餐A", "150"], ["售卖套餐B", "250"]] headings_sell_pakete = ["名称", "售价"] layout_buy_package_table = [ [ sg.Table( values=package_data_all, headings=headings_pakete, max_col_width=35, auto_size_columns=True, display_row_numbers=True, justification="left", num_rows=15, key="-TABLE_BUY_PACKAGES-", row_height=30, background_color="#272533", text_color="white", enable_events=True ), sg.Text("Paketpreis", size=10, background_color="#272533", text_color="white", pad=(20)), sg.Input(size=15, key="-INDIVIDUAL_BUY_PRICE-", enable_events=True), sg.Button("Paket erstellen", button_color=("black", "darkorange"), size=(12, 1)) ] ] layout_sell_package_table = [ [ sg.Table( values=sell_package_data, headings=headings_sell_pakete, max_col_width=35, auto_size_columns=True, display_row_numbers=True, justification="left", num_rows=15, key="-TABLE_SELL_PACKAGES-", row_height=30, background_color="#272533", text_color="white", enable_events=True ), sg.Text("Paketpreis", size=10, background_color="#272533", text_color="white", pad=(20)), sg.Input(size=15, key="-INDIVIDUAL_SELL_PRICE-", enable_events=True), sg.Button("Paket erstellen", button_color=("black", "darkorange"), size=(12, 1)) ] ] tab_group_packages = [ [ sg.TabGroup( [ [sg.Tab("Pakete - Kauforder", layout_buy_package_table, background_color="#272533")], [sg.Tab("Pakete Verkauforder", layout_sell_package_table, background_color="#272533")] ], tab_background_color="darkorange" # 移除不需要的enable_events,避免干扰表格事件 ) ], [ sg.Button("Alle erstellen", button_color=("black", "green"), size=(20, 2)), sg.Button("Abbrechen", button_color=("black", "red"), size=(20, 2)) ] ] window_package_table = sg.Window("Paketübersicht", tab_group_packages, background_color="#272533") while True: # 正确接收event和values event, values = window_package_table.read() # 处理窗口关闭或取消按钮事件 if event == sg.WIN_CLOSED or event == "Abbrechen": break # 处理购买表格点击事件 if event == "-TABLE_BUY_PACKAGES-": selected_rows = values["-TABLE_BUY_PACKAGES-"] if selected_rows: # 取第一个选中行的数据(表格默认单选,若需多选可遍历selected_rows) selected_data = package_data_all[selected_rows[0]] # 将价格列数据填入输入框 window_package_table["-INDIVIDUAL_BUY_PRICE-"].update(selected_data[1]) print("选中购买套餐数据:", selected_data) # 处理售卖表格点击事件 if event == "-TABLE_SELL_PACKAGES-": selected_rows = values["-TABLE_SELL_PACKAGES-"] if selected_rows: selected_data = sell_package_data[selected_rows[0]] window_package_table["-INDIVIDUAL_SELL_PRICE-"].update(selected_data[1]) print("选中售卖套餐数据:", selected_data) window_package_table.close()
关键说明
- 表格开启
enable_events=True后,点击行时会触发对应KEY的事件,选中行的索引存储在values[表格KEY]中 - 若需要支持多行选中,需在表格初始化时添加
select_mode=sg.TABLE_SELECT_MODE_EXTENDED,并遍历selected_rows处理每一行数据 - 必须处理
sg.WIN_CLOSED事件,否则窗口无法正常关闭
内容的提问来源于stack exchange,提问作者Vertex
相关产品推荐
相关产品推荐

