如何在Python Tkinter中为战舰游戏并排显示两个网格?
战舰游戏双网格实现方案

我们正在开发一款战舰游戏,希望为每位用户设置独立的启动界面。点击开始按钮后,需显示两个独立的网格,并在网格下方添加输入框。目前使用Tkinter库开发,但仅能实现一个网格的显示,现有代码可正常运行,寻求实现第二个网格显示的方案:
import tkinter user1boats: list[list[int]]=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] def displaygrid(grid: list[list[int]]): for i in range(len(grid)): Window.columnconfigure(i, weight=1, minsize=5) Window.rowconfigure(i, weight=1, minsize=5) for j in range(len(grid[i])): frame = tkinter.Frame(master=Window, borderwidth=0.5) frame.grid(row=i, column=j, padx=3, pady=1) label = tkinter.Label(master=frame, text=str(grid[i][j])) label.pack(padx=3, pady=1)
问题根源
原代码的displaygrid直接将所有网格元素挂载到主窗口,且行列索引从0开始,第二个网格会完全覆盖第一个。要实现双网格并排,必须用容器组件隔离两个网格的布局空间。
解决方案代码
import tkinter # 定义两位玩家的网格数据 user1boats: list[list[int]] = [ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ] user2boats: list[list[int]] = [ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ] def displaygrid(parent, grid: list[list[int]]): # 为父容器配置行列规则 for i in range(len(grid)): parent.columnconfigure(i, weight=1, minsize=5) parent.rowconfigure(i, weight=1, minsize=5) for j in range(len(grid[i])): # 每个单元格用Frame包裹,添加边框增强视觉效果 frame = tkinter.Frame(master=parent, borderwidth=0.5, relief="solid") frame.grid(row=i, column=j, padx=3, pady=1) # 设置Label宽度保证单元格对齐 label = tkinter.Label(master=frame, text=str(grid[i][j]), width=2) label.pack(padx=3, pady=1) # 初始化主窗口 Window = tkinter.Tk() Window.title("战舰游戏") # 创建两个Frame作为网格容器,实现并排布局 grid_frame1 = tkinter.Frame(Window) grid_frame1.grid(row=0, column=0, padx=20, pady=10) grid_frame2 = tkinter.Frame(Window) grid_frame2.grid(row=0, column=1, padx=20, pady=10) # 渲染两个玩家的网格 displaygrid(grid_frame1, user1boats) displaygrid(grid_frame2, user2boats) # 创建输入框区域,跨两列布局 entry_container = tkinter.Frame(Window) entry_container.grid(row=1, column=0, columnspan=2, pady=10) tkinter.Label(entry_container, text="玩家1坐标输入:").grid(row=0, column=0, padx=5) entry_player1 = tkinter.Entry(entry_container) entry_player1.grid(row=0, column=1, padx=5) tkinter.Label(entry_container, text="玩家2坐标输入:").grid(row=0, column=2, padx=5) entry_player2 = tkinter.Entry(entry_container) entry_player2.grid(row=0, column=3, padx=5) # 启动主循环 Window.mainloop()
核心修改说明
- 新增父容器参数:
displaygrid函数添加parent参数,让网格可以挂载到任意容器,不再绑定主窗口 - 用Frame隔离布局:创建两个独立的
Frame分别承载两个网格,通过grid布局的column参数实现并排 - 优化视觉效果:给单元格Frame添加
relief="solid"边框,设置Label固定宽度保证网格对齐 - 添加输入框区域:用一个跨列的Frame承载两个输入框,实现网格下方的输入布局
内容的提问来源于stack exchange,提问作者bobandsteven
相关产品推荐
相关产品推荐

