ディクショナリの1つの要素を操作すると他の要素まで同時に操作されてしまう。

Python

1from tkinter import filedialog 2from tkinter import messagebox 3 4# 色の設定5# 原色6red = (255, 0, 0)7green = (0, 255, 0)8blue = (0, 0, 255)9yellow = (255, 255, 0)10purple = (255, 0, 255)11black = (0, 0, 0)12white = (255, 255, 255)13# 各文明14light = (255, 255, 120)15water = (120, 120, 255)16darkness = (120, 120, 120)17fire = (255, 120, 120)18nature = (120, 255, 120)19zero = white 20 21# txtファイル内の文字と色を対応させる関数22def color_read(color):23 if color in ["白", "光"]:24 return light 25 elif color in ["青", "水"]:26 return water 27 elif color in ["黒", "闇"]:28 return darkness 29 elif color in ["赤", "火"]:30 return fire 31 elif color in ["緑", "自然"]:32 return nature 33 elif color in ["無", "零", "ゼロ"]:34 return white 35 else:36 return purple 37 38# txtファイルからデッキを読み取る関数39def deck_read():40 # ファイルパスを格納する変数41 # tkinter の filedialog によってブラウズウィンドウを表示、ファイル名を参照42 file = filedialog.askopenfilename()43 44 45 # ファイルが指定されなかったら空のデッキを返す46 if file == "":47 return []48 # txt ファイルでなければエラーメッセージを表示して空のデッキを返す49 elif file[-3:] != "txt":50 messagebox.showerror("Duel Masters", "txtファイルを選択してください")51 return []52 53 # txt ファイルなら開く54 else:55 f = open(file,"r",encoding="utf-8")56 57 # カードを入れるリスト58 MAIN_deck = []59 60 61 # 1行ずつ処理62 for line in f:63 # 全角空白を半角空白に置換64 line = line.replace("\n","")65 66 # その行が空でなければ処理67 if line != "":68 # 最初の文字がカードの文明なら処理69 if line[:1] in ("白", "青", "黒", "赤", "緑", "無", "光", "水", "闇", "火", "自", "零", "ゼ") and line[:2] != "零龍":70 # その行を半角空白で分割、カード情報のリストにする71 card_info_list = line.replace("\u3000"," ").split(" ")72 # カード名を入れる変数73 card_name = ""74 # カードの枚数を入れる変数75 card_value = 076 # カードの枚数が入力されていなかったら処理77 if card_info_list[-1].isdigit() == False:78 # カード情報が文明のみになるまで名前を結合79 # カード名に空白が含まれている場合の処理80 while len(card_info_list)>=2:81 card_name += card_info_list[1]82 card_info_list.pop(1)83 # カード枚数を1枚に指定84 card_value = 185 # カードデータの完成86 card_info = {"name":card_name, "color":color_read(card_info_list[0]), "tap":False, "select":False, "position":[], "reverse":False}87 else:88 # カード情報が文明のみになるまで名前を結合89 # カード名に空白が含まれている場合の処理90 while len(card_info_list)>=3:91 card_name += card_info_list[1]92 card_info_list.pop(1)93 # カード枚数を入力通りに指定94 card_value = int(card_info_list[-1])95 # カードデータの完成96 card_info = {"name":card_name, "color":color_read(card_info_list[0]), "tap":False, "select":False, "position":[], "reverse":False}97 98 for i in range(card_value):99 MAIN_deck.append(card_info)100 101 # ファイルを閉じる102 f.close()103 104 #登録完了のメッセージ105 messagebox.showinfo("Notice","デッキを登録しました")106 # 読み取ったデッキを返す107 return MAIN_deck 108 109# メイン部分110# デッキを読み込み111deck = deck_read()112# デッキ内のカードそれぞれに番号を割り当てる113for i in range(len(deck)):114 deck[i]["card_num"] = i # ここがうまくいかない115# 読み取ったデッキを表示116print(deck)

コメントを投稿

0 コメント