【问题标题】:how can i deepcopy list of objects in python我如何在python中深度复制对象列表
【发布时间】: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


【解决方案1】:

您不能深拷贝或腌制 tkinter 对象。没有解决方法。 Tkinter 对象只是存在于嵌入式 Tcl 解释器内部的对象的包装器。这个 Tcl 解释器对 python 对象一无所知,python 没有办法pickle tcl 对象。

【讨论】:

  • 请建议我第二种方法来完成这项工作
猜你喜欢
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多