Tkinter删除放置在画布上的框架可以在一个画布上使用,但不能在另一个画布上使用

问题描述

因此,我正在构建一个纸牌游戏程序,以允许2个玩家彼此对战(MTG),但是我对此问题完全感到困惑。

所以我有2个画布,每个玩家要生成的1个“战场”代码是相同的(只是更改了名称),并且将“卡”添加到每个战场的代码几乎是相同的(删除了一些菜单)对手的牌)

当我在玩家卡上使用frame.destory()时,它可以正常工作并删除框架,但是当我在对手卡框架上使用它时,程序将停止运行,并且没有响应。

我正在使用python 2.7,该程序在card_frame.destroy()上的robot_card_removed_field例程中停顿了

有什么想法我做错了吗?

这是我的代码

对手框架创建代码

    def create_opponent_frame(self):
    self.opponent_frame = tk.Frame(self.field,bg='grey11',highlightthickness=0)

    self.opponent_battlefield = tk.Frame(self.opponent_frame,highlightthickness=0)
    self.opponent_battlefield_canvas = tk.Canvas(self.opponent_battlefield)
    self.opponent_battlefield_canvas.pack(side='top',padx=(2,2),pady=(2,2))
    self.opponent_battlefield.pack(side='left',fill='both',expand='True',padx=(5,5),pady=(5,5))

    self.opponent_frame.pack(side='top',fill="both",expand="True")

播放器框架创建;

    def create_player_frame(self):
    self.player_frame = tk.Frame(self.field,highlightthickness=0)
    self.player_battlefield = tk.Frame(self.player_frame,highlightthickness=0)
    self.player_battlefield_canvas = tk.Canvas(self.player_battlefield)
    self.player_battlefield_canvas.pack(side='top',2))
    self.player_battlefield.pack(side='left',5))

    self.player_frame.pack(side='top',expand="True")

玩家卡的创建(图像是从数据库中读取的图像文件);

    def create_player_battlefield_card(self,card,status,facing):       
        details['card'] = card
        details["card frame"] = tk.Frame(self.player_battlefield_canvas,bg='midnight blue',highlightthickness=0)
        details["card canvas"] = tk.Canvas(details["card frame"],width=75,height=105,highlightthickness=0)
        details["original"] = image
        details["img"] = details["original"].resize((75,105))
        details["img"] = ImageTk.PhotoImage(details["img"])            
        details['list index'] = a
        details['count'] = self.player_field
      
        details["object"] = details["card canvas"].create_image(0,anchor='nw',image=details["img"])         

        self.player_battlefield_image_objects.append(details)

        details["card canvas"].pack(side='top')

        self.player_battlefield_canvas.create_window((55,75),window=details["card frame"],tags=details['count'])

创建对手卡(同样,图像是来自db的图像文件);

    def create_opponent_battlefield_card(self,facing):
        details['card'] = card
        details["card frame"] = tk.Frame(self.opponent_battlefield_canvas,highlightthickness=0)
        details["original"] = image
        details['img'] = image.rotate(180)
        details["img"] = details["img"].resize((75,105))
        details["img"] = ImageTk.PhotoImage(details["img"])
        details['list index'] = a
        details['count'] = self.opponent_field   

        details["object"] = details["card canvas"].create_image(0,image=details["img"])

        self.opponent_battlefield_image_objects.append(details)

        details["card canvas"].pack(side='top')

        y = self.opponent_battlefield_canvas.winfo_height() - details["card frame"].winfo_height()
        y -= 75
        self.opponent_battlefield_canvas.create_window((55,y),tags=details['count'])

删除玩家卡的代码

    def field_to_hand(self,list_index):

    card = self.player_battlefield_image_objects[list_index]['card']
    card_frame = self.player_battlefield_image_objects[list_index]['card frame']
    status = self.player_battlefield_image_objects[list_index]['status']

    if status == 'original':
        self.create_player_hand_card(card)

    card_frame.destroy()

    self.player_battlefield_image_objects.pop(list_index)

    for detail in self.player_battlefield_image_objects:
        if detail['list index'] > list_index:
            self.player_battlefield_image_objects[detail['list index'] - 1]['list index'] -= 1

删除对手卡的代码

    def opponent_card_removed_field(self,list_index):
    card = self.opponent_battlefield_image_objects[list_index]['card']
    card_frame = self.opponent_battlefield_image_objects[list_index]['card frame']
    status = self.opponent_battlefield_image_objects[list_index]['status']

    card_frame.destroy()

    print self.opponent_battlefield_image_objects

    self.opponent_battlefield_image_objects.pop(list_index)

    for detail in self.opponent_battlefield_image_objects:
        if detail['list index'] > list_index:
            self.opponent_battlefield_image_objects[detail['list index'] - 1]['list index'] -= 1

经过编辑以减少代码

解决方法

嗯,在2.7中似乎有些怪异。我刚刚将代码移植到python 3.7上,一切都很好。它运行时没有上面我看到的任何问题