如何在PySimpleGUI中实现两列并排的10×10按钮网格?
解决PySimpleGUI中并排显示两个10×10按钮网格的问题
你遇到的错误是因为直接将网格的列表嵌套结构作为布局元素使用,PySimpleGUI的布局要求每行的元素必须是GUI组件(比如Button、Column等),而不是列表的列表。要实现两个网格并排,需要用sg.Column组件将每个完整的网格包裹起来,再把两个Column放在同一行布局中。
修改后的完整代码
import PySimpleGUI as sg sg.theme('Dark Blue 3') MAX_ROWS = MAX_COL = 10 # 封装生成网格的函数,通过key前缀区分两个网格 def create_grid(grid_prefix): return [ [sg.Button( 'O', size=(4, 2), pad=(0, 0), border_width=0, key=(grid_prefix, row, col) ) for col in range(MAX_COL)] for row in range(MAX_ROWS) ] # 生成两个网格的Column组件 grid1_col = sg.Column(create_grid('grid1'), pad=(10, 0)) grid2_col = sg.Column(create_grid('grid2'), pad=(10, 0)) # 主布局:顶部标题+消息栏,中间两个并排网格,底部退出按钮 layout = [ [sg.Text('双网格菜单', font='Default 25')], [sg.Text(size=(30, 1), key='-MESSAGE-', font='Default 20')], [grid1_col, grid2_col], # 两个网格Column并排 [sg.Button('Exit', button_color=('white', 'red'))] ] window = sg.Window('双网格演示', layout) # 模拟命中位置(示例数据,可根据实际需求修改) position = {('grid1', 2, 3), ('grid1', 5, 5), ('grid2', 1, 1)} while True: event, values = window.read() print(event, values) if event in (sg.WIN_CLOSED, 'Exit'): break # 判断是否是网格按钮事件 if isinstance(event, tuple) and len(event) == 3: grid_prefix, row, col = event if event in position: window[event].update('H', button_color=('white', 'red')) window['-MESSAGE-'].update(f'网格{grid_prefix[-1]}命中: ({row}, {col})') else: window[event].update('M', button_color=('white', 'black')) window['-MESSAGE-'].update(f'网格{grid_prefix[-1]}未命中: ({row}, {col})') window.close()
关键修改说明
- 用
sg.Column包裹网格:每个完整的10×10按钮列表被包裹在sg.Column中,将嵌套的列表结构转化为单个GUI元素,满足布局要求。 - 区分网格按钮的Key:给每个网格的按钮Key加上前缀(
grid1/grid2),这样在事件处理时能准确区分是哪个网格的按钮被点击。 - 重构布局结构:将两个Column放在同一行布局中,实现并排显示;同时调整消息栏的宽度,适配双网格的显示。
- 完善事件处理:通过判断事件的元组结构,识别网格按钮事件,并根据前缀区分不同网格的操作。
内容的提问来源于stack exchange,提问作者techguy
相关产品推荐
相关产品推荐

