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

使用Tkinter开发数独游戏时GUI网格仅显示最后3个块缺失前6行问题求解

问题原因

你代码的核心问题是二维列表初始化时使用了浅拷贝写法:

# 错误写法
blocks = [[None] * 3] * 3
btn_cells = [[None] * 9] * 9

这种[列表] * 数字的写法生成的二维列表,所有子列表都是同一个对象的引用,你对任意一行的元素赋值,都会同步修改其他行对应位置的元素。
在你给blocks[i][j]循环赋值时,i=2(最后一行大区块)的赋值会覆盖掉i=0、i=1的赋值,最终实际上只有3个有效的大区块,所以界面只显示最后3个区块的内容。

修复方案

把二维列表的初始化改为列表推导式,生成独立的子列表即可:

import tkinter as tk

root = tk.Tk()

# Create the puzzle
puzzle = tk.Frame(root, bg='white')
puzzle.pack()

# 修复:用列表推导式初始化独立的子列表
blocks = [[None for _ in range(3)] for _ in range(3)]
for i in range(3):
    for j in range(3):
        blocks[i][j] = tk.Frame(puzzle, bd=1, highlightbackground='light blue',
                                highlightcolor='light blue', highlightthickness=1)
        blocks[i][j].grid(row=i, column=j, sticky='nsew')

# 修复:同样用列表推导式初始化
btn_cells = [[None for _ in range(9)] for _ in range(9)]
for i in range(9):
    for j in range(9):
        # Add cell to the block
        # Add a frame so that the cell can form a square
        frm_cell = tk.Frame(blocks[i // 3][j // 3])
        frm_cell.grid(row=(i % 3), column=(j % 3), sticky='nsew')
        frm_cell.rowconfigure(0, minsize=50, weight=1)
        frm_cell.columnconfigure(0, minsize=50, weight=1)
        var = tk.StringVar()
        btn_cells[i][j] = tk.Button(frm_cell, relief='ridge', bg='white', textvariable=var)
        btn_cells[i][j].grid(sticky='nsew')

        # Show the index for reference
        var.set(str((i, j)))
        
root.mainloop()

修改后运行就能正常显示完整的9*9数独网格,所有区块和单元格都会正确渲染。

内容的提问来源于stack exchange,提问作者wong.lok.yin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:45:03