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

如何用rich或textual高效生成棋盘式网格?是否需自定义组件?

在Rich/Textual中实现棋盘式网格的高效方案

一、用Rich实现静态棋盘网格

Rich的Table确实不适合动态修改单个单元格——它更偏向一次性渲染结构化数据,没有提供直接引用或修改单元格的API。要做棋盘式网格,推荐用**rich.grid.Grid**配合rich.panel.Panel:

  • Grid负责划分终端空间为网格布局,支持自定义行列数;
  • 每个网格单元可以放入Panel,通过Panel的style参数单独控制背景色、前景色。

示例代码:

from rich import print
from rich.grid import Grid
from rich.panel import Panel

# 创建8x8的棋盘网格
grid = Grid(expand=True)
grid.columns = 8
grid.gutter = 0

for row in range(8):
    for col in range(8):
        # 交替设置背景色,实现棋盘效果
        bg_color = "white on black" if (row + col) % 2 == 0 else "black on white"
        grid.add(Panel("", style=bg_color, padding=0))

print(grid)

二、用Textual实现交互式棋盘网格

如果需要交互式操作(比如点击单元格、动态修改样式),Textual的**textual.widgets.Grid**是更优选择——它是可交互的UI布局组件,每个网格单元可以挂载独立的Widget,支持动态引用和样式修改。

方案1:用默认Widget快速实现

直接用Static组件作为单元格,放入Grid中,通过索引或直接引用修改样式:

from textual.app import App, ComposeResult
from textual.widgets import Grid, Static

class ChessboardApp(App):
    CSS_PATH = """
    Grid {
        size: 80 16;  # 网格宽80字符,高16行
        grid-size: 8 8;  # 8列8行
        gutter: 0;
    }
    Static {
        width: 100%;
        height: 100%;
    }
    """

    def compose(self) -> ComposeResult:
        grid = Grid()
        for row in range(8):
            for col in range(8):
                bg = "white on black" if (row + col) % 2 == 0 else "black on white"
                grid.add(Static(style=bg, id=f"cell-{row}-{col}"))
        yield grid

    def on_mount(self) -> None:
        # 示例:修改某个单元格的背景色
        cell = self.query_one("#cell-2-3", Static)
        cell.style = "red on yellow"

if __name__ == "__main__":
    ChessboardApp().run()

方案2:自定义单元格组件

如果需要更复杂的交互(比如单元格点击事件),可以自定义Widget:

from textual.app import App, ComposeResult
from textual.widgets import Grid
from textual.widget import Widget

class ChessCell(Widget):
    def __init__(self, row: int, col: int, **kwargs):
        self.row = row
        self.col = col
        super().__init__(**kwargs)

    def on_mount(self) -> None:
        # 初始化棋盘色
        self.styles.background = "black" if (self.row + self.col) % 2 == 0 else "white"

    def on_click(self) -> None:
        # 点击切换背景色
        self.styles.background = "red" if self.styles.background == "black" else "black"

class ChessboardApp(App):
    CSS_PATH = """
    Grid {
        size: 80 16;
        grid-size: 8 8;
        gutter: 0;
    }
    ChessCell {
        width: 100%;
        height: 100%;
    }
    """

    def compose(self) -> ComposeResult:
        grid = Grid()
        for row in range(8):
            for col in range(8):
                grid.add(ChessCell(row, col))
        yield grid

if __name__ == "__main__":
    ChessboardApp().run()

三、是否需要自行构建组件?

  • 静态棋盘:用Rich的Grid+Panel或Textual的Grid+Static即可,无需自定义组件;
  • 交互式/复杂逻辑棋盘:自定义组件(如上述ChessCell)能让代码更清晰,便于维护和扩展交互逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:27:20