【发布时间】:2021-02-01 22:30:10
【问题描述】:
大家好,我在这个 bug 中已经有 4 天了,但我仍然没有完成项目并且从未解决过这个 bug。 当我试图在 tictactoe 项目中深度复制 tkinter 按钮以检查玩家与 PC 模式下的玩家获胜时,会出现该错误,但每次我复制一个按钮并将其更改为 x 时,例如检查 PC 的敌人是否获胜,就好像它是 ai ,它也在更改破坏应用程序并且接下来无法执行任何操作的原始按钮。 这是我项目的最后一步。但是,我尝试了无效的 numpy.copy() 和引发了的 copy.deepcopy():
TypeError: can't pickle _tkinter.tkapp objects
这是代码中出现错误的部分,特别是注释行
def free_spot(i, j): # Check for free spots in the board
return buttons_grid[i][j]['text'] == ''
def enemy_strategy():
global turn
corners = [[0, 0], [2, 0], [2, 2], [0, 2]]
if len(free_places()) == 9:
any_corner = rd.choice(corners)
buttons_grid[any_corner[0]][any_corner[-1]].config(text='O')
turn = 'player'
sign_label.config(text='Your turn')
elif free_spot(1, 1):
buttons_grid[1][1].config(text='O')
turn = 'player'
else:
for x, i in enumerate(free_places()):
grid_copy = array(buttons_grid)
grid_copy[i[0]][i[-1]].config(text='O')
# board_copy[i[0]][i[-1]] = np.copy(buttons_grid)
# board_copy[..][..].config(text='X')
if game_check(grid_copy) == 1:
buttons_grid[i[0]][i[-1]].config(text='O')
sign_label.config(text="Enemy Won!")
break
# elif game_check(board_copy) == 1:
# return buttons_grid[..][..].config(text='O')
# else:
# board_copy[..][..].config(text='')
elif game_check(grid_copy) == 0:
buttons_grid[i[0]][i[-1]].config(text='O')
sign_label.config(text="Draw")
break
elif game_check(grid_copy) == -1:
grid_copy[i[0]][i[-1]].config(text='')
if x == len(free_places())-1:
buttons_grid[i[0]][i[-1]].config(text='O')
turn = 'player'
sign_config(sign_label, 'Your')
else:
continue
我已经用 tkinter 完成了一个剪刀石头布应用程序,我一直想继续前进,每次都做一个更复杂的项目。请帮助我,好像我还是 18 岁的初学者一样
此外,我看到了一个名为 minimax 的算法,但我认为与我的水平相比过于复杂,这就是我使用普通函数和 if 语句而不是 minimax 的原因
非常感谢。
注意:buttons_grid 是一个 3x3 嵌套的 tkinter 按钮列表
【问题讨论】:
-
除非类为此提供方法,否则您通常不能深度复制类对象。您应该列出数据并将其复制。
-
请解释一下,我的项目中不使用类,只使用函数,我怎样才能摆脱这个错误
-
Tk对象是类对象,不能复制。
标签: python object tkinter copy