使用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
相关产品推荐
相关产品推荐

