You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()

核心修改说明

  1. 新增父容器参数:displaygrid函数添加parent参数,让网格可以挂载到任意容器,不再绑定主窗口
  2. 用Frame隔离布局:创建两个独立的Frame分别承载两个网格,通过grid布局的column参数实现并排
  3. 优化视觉效果:给单元格Frame添加relief="solid"边框,设置Label固定宽度保证网格对齐
  4. 添加输入框区域:用一个跨列的Frame承载两个输入框,实现网格下方的输入布局

内容的提问来源于stack exchange,提问作者bobandsteven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:07:41