Tkinter八皇后代码报__init__参数错误且窗口无内容如何解决?
问题修复方案
以下为对应问题的直接修复内容:
1. 修复__init__() takes 1 positional argument but 2 were given报错
你实例化board2时传入了皇后位置列表,但EQ类的__init__方法没有设计接收参数的逻辑,因此直接触发参数数量不匹配的报错。修改__init__方法增加可选初始参数即可:
def __init__(self, queens=None): # 支持传入初始皇后位置,无参数则默认全为-1 if queens is None: self.queens = SIZE * [-1] else: self.queens = queens.copy()
同时注意不要把Tk实例和mainloop()放在__init__里,否则实例化EQ的时候会直接阻塞在窗口渲染阶段,后面的赋值、判断逻辑都不会执行,这也是你窗口运行时空白的核心原因。
2. 修复Tkinter窗口空白、逻辑阻塞问题
把GUI相关逻辑从__init__中抽离为单独的渲染方法,待你确认皇后位置正确后再调用显示棋盘:
# 在EQ类中新增渲染棋盘的方法 def render_board(self): window = Tk() window.title("Eight Queens") cell_size = 50 canvas = Canvas(window, width=SIZE*cell_size, height=SIZE*cell_size) canvas.pack() # 绘制棋盘格和皇后 for i in range(SIZE): for j in range(SIZE): color = "white" if (i+j)%2 == 0 else "gray" canvas.create_rectangle(j*cell_size, i*cell_size, (j+1)*cell_size, (i+1)*cell_size, fill=color) if self.queens[j] == i: canvas.create_text(j*cell_size+cell_size//2, i*cell_size+cell_size//2, text="♕", font=("Arial", 30), fill="black") window.mainloop()
需要显示窗口时调用board2.render_board()即可。
3. 修复is_solved方法隐藏bug
你在判断右下对角线冲突的分支中,找到冲突后只写了return没有返回False,会导致冲突场景下返回None,逻辑判断出错,修改对应代码行:
# 原错误代码 if count + self.queens[i] == self.queens[j]: return # 修改后 if count + self.queens[i] == self.queens[j]: return False
调整后的main函数参考
def main(): board1 = EQ() board1.set(0, 2) board1.set(1, 4) board1.set(2, 7) board1.set(3, 1) board1.set(4, 0) board1.set(5, 3) board1.set(6, 6) board1.set(7, 5) print("Is board1 a correct eight queen placement?", board1.is_solved()) board2 = EQ([0, 4, 7, 5, 2, 6, 1, 3]) if board2.is_solved(): print("Eight queens are placed correctly in board2") board2.print_board() # 调用方法显示GUI棋盘 board2.render_board() else: print("Eight queens are placed incorrectly in board2")
内容的提问来源于stack exchange,提问作者steeplearningcurve
相关产品推荐
相关产品推荐

