前提・実現したいこと
ここに質問の内容を詳しく書いてください。
「ゼロからやさしくはじめるPython入門」の6章のサンプルを一通り実行し終わったので、
スタート地点にキャラクタがおかれるように改修する学習を思いつき動作確認のためリストを表示する行を追加、
表示されることを確認しましたが本日になって実行したところ、下記のようなエラーが出るようになってしまいました。
なぜ、昨日までは動いていたのに、突然map_dataが宣言されていない。とエラーが出てしまうのでしょうか?
発生している問題・エラーメッセージ
NameError Traceback (most recent call last) <ipython-input-6-0dad414e2ae4> in <module> 18 #py = 2 19 player_image = "player.png"#player.png ---> 20 print(map_data) 21 print(map_data[py]) 22 print(map_data[px]) NameError: name 'map_data' is not defined
該当のソースコード
#エラーの発生するプログラム from maze_show import * from maze_show2 import load_map_from_tsv from PIL import Image, ImageTk import tkinter.messagebox as msbox def main (): global map_data # 迷路データを読み込む map_data = load_map_from_tsv("maze3.csv") #maze_show2の関数を利用してcsv読み込み # ウィンドウを作成 create_window(map_data, [load_image, set_event]) # グローバル変数の初期化 px, py = (2, 2) #プレイヤー座標 16,13:3x3の所 2,2:スタート地点 24,17:ゴール手前 #px = 1 #py = 2 player_image = "player.png"#player.png print(map_data) print(map_data[py]) print(map_data[px]) print(map_data[py][px])#現在の足元情報 # プレイヤー画像を読み込む def load_image(cv, map_data): global canvas, img_tk canvas = cv img = Image.open(player_image) img_tk = ImageTk.PhotoImage(img) draw_player(canvas) # プレイヤーを描画 def draw_player(cv): x = px * tile_size y = py * tile_size cv.create_image(x, y, image=img_tk, anchor=NW) # マウスイベントを登録 def set_event(cv, map_data): cv.bind("<1>", canvas_click) #左クリックされたらcanvas_click動作実行 # キャンバスをクリックしたときの処理 def canvas_click(e): global px, py # マウス座標を得る mx = e.x my = e.y # 移動前に前回の値を記録 px_tmp = px py_tmp = py # 上下左右どちらに動くか判定 #座標の絶対計算 xx, yy = [px * tile_size, py * tile_size] ix, iy = [mx - xx, my - yy] #クリック位置と現在地の差を計算 if (0 <= ix < tile_size) and (0 <= iy <tile_size): pass #差がタイルサイズ以下ならクリックしても何もしない elif abs(ix) > abs(iy): #左右移動 if ix > 0: px += 1#クリック位置が現在地より右ならpxに1加算 else: px -= 1#そうでないならpxから1減産 else:#上下移動 if iy > 0: py += 1 #現在地をy以下ならpyに1を加算 else: py -= 1 # 移動先がマップデータ外なら戻す if px < 0 or px >= len(map_data[0]): px = px_tmp #pxがマップ外なら元に戻す if py < 0 or py >= len(map_data): py = py_tmp #pyがマップ外なら元に戻す # 移動先が壁なら元の位置に戻す print("現在座標={0},{1}".format(px, py)) mv = map_data[py][px] if mv == 1: px = px_tmp py = py_tmp msbox.showinfo(message="壁にぶつかった") return # プレイヤーを描画 canvas.delete("all") #キャンバスから全削除 draw_map(canvas, map_data)# マップ描画 draw_player(canvas)#プレイヤー描画 #print("現在座標={0},{1}".format(px, py)) print("mv={0}".format(mv)) # ゴールにたどり着いたか if mv == 3: msbox.showinfo(message = "祝 ごーる") if __name__ == "__main__" : main() #呼び出しをしているコード1 from tkinter import * tile_size = 20 # 迷路データを取り込む def load_map_data(): from maze_data import data return data # 迷路を表示する関数 def draw_map(cv, data): # 左上から右下へと描画 rows = len(data) cols = len(data[0]) for y in range(rows): y1 = y * tile_size y2 = y1 + tile_size for x in range(cols): x1 = x * tile_size x2 = x1 + tile_size # xとyのあたいから、対応するdataリストの値を得る p = data[y][x] # 値に応じた色を決定する if p == 0: color = "white" if p == 1: color = "#404040" if p == 2: color = "red" if p == 3: color = "blue" # 正方形を描画 cv.create_rectangle( x1, y1, x2, y2, fill=color, outline = "black", width = 2) # ウィンドウとキャンバスを作成 def create_window(map_data, events = []): win = Tk() win.title("迷路") rows = len(map_data) cols = len(map_data[0]) cv = Canvas(win, width = (cols * tile_size), height = (rows * tile_size)) cv.pack() draw_map(cv, map_data) # 追加処理あればここで実施 for func in events: func(cv, map_data) win.mainloop() if __name__ == "__main__": map_data = load_map_data() create_window(map_data) #呼び出しをしているコード2 from tkinter import * from maze_show import create_window # CSVを取り込む def load_map_from_tsv(filename): # ファイルを開く fp = open(filename, "rt", encoding = "utf-8") tsv = fp.read() # CSVファイルを解析 rows = tsv.split("\n") result = [] for line in rows: cols = line.split("\t") if len(cols) <= 1: break cols = list(map(int, cols)) result.append(cols) return result if __name__ == "__main__": map_data = load_map_from_tsv("maze2.csv") create_window(map_data)
試したこと
・以前別件ですが、どこにもスペルミスなどないのにエラーが出ることがあり、Anacondaを最新版に入れ替え、
(PCを再起動するとどこにも修正を加えていないのに実行できる場合も)
・当該の.jypnbが実行中でなければならないのかと起動。効果ありませんでした。
・当該.jypnbを.PY形式でjupyterに保存、画像、CSVも同階層に保存されていることは確認済です。
補足情報(FW/ツールのバージョンなど)
動作環境Anaconda3をインストール
jupyterは6.3.0
Python 3.8.8 (default, Apr 13 2021, 15:08:03) [MSC v.1916 64 bit (AMD64)]
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。