前提・実現したいこと
サブウインドウで一筆書きのゲームを作成したいです。
メインウインドウで実行は出来るのですが、サブウインドウに組み込む際にエラーが発生します。
発生している問題・エラーメッセージ
UnboundLocalError: local variable 'maze' referenced before assignment
該当のソースコード
Python
1import tkinter as tk 2import tkinter.ttk as ttk 3import random 4import winsound 5key = "" 6 7def sub_window(): 8 win = tk.Toplevel() 9 win.geometry("650x500") 10 win.title("迷路") 11 cv= tk.Canvas(win,background="white", width=800, height=560) 12 cv.place(x=0, y=0) 13 14 15 def key_down(e): #キーが押された時に行う処理 16 global key 17 key = e.keysym #keysymには押されたキーの情報が入る 18 def key_up(e): #キーが離された時に行う処理 19 key = ""#キーが離された時、キーの情報を空にする 20 mx = 1 21 my = 1 22 yuka = 0 23 yukanokazu = 0 24 25 26 def main_proc(): 27 global my,mx,yuka,yukanokazu 28 if key == "Shift_L"and yuka >1: #左シフトキーを押し、2マス以上塗っていたら 29 cv.delete("PAINT") #塗ったところを消す 30 my = 1 #キャラクターを初期位置に戻す 31 mx = 1 32 yuka = 0 33 for y in range(7): 34 for x in range(10): 35 if maze[y][x] == 2: 36 maze[y][x] = 0 37 38 if key == "Up"and maze[my-1][mx] == 0: #upのキーが押されたら 39 my = my-1 #キャラクターのy座標を-20 40 if key == "Down"and maze[my+1][mx] == 0: 41 my = my+1 42 if key == "Left"and maze[my][mx-1] == 0: 43 mx = mx-1 44 if key == "Right"and maze[my][mx+1] == 0: 45 mx = mx+1 46 if maze[my][mx] == 0:#移動したところが通路なら 47 maze[my][mx] = 2 #リストの値を2にする 48 yuka = yuka+1 49 cv.create_rectangle(mx*80,my*80,mx*80+79,my*80+79,fill="pink",width=0,tag="PAINT") #そこをピンクで塗る 50 cv.delete("MYCHR") #一旦消す 51 cv.create_image(mx*80+40,my*80+40,image = img,tag = "MYCHR")#再度キャラクターの画像を表示 52 53 if yuka == yukanokazu: 54 cv.update() 55 tk.messagebox.showinfo("おめでとう!","全ての床を塗りました!") 56 else: 57 win.after(100,main_proc) 58 59 60 win.bind("<KeyPress>",key_down) #keyが押された時に行う処理を指定。 61 win.bind("<KeyRelease>",key_up) #keyが離された時に行う処理を指定。 62 63 maze=[ #床と壁を数値に置き換える。床を0、壁を1。Excelからのコピペをここの下に貼り付ける 64 [1,1,1,1,1,1,1,1,1,1], 65 [1,0,0,0,0,1,0,0,0,1], 66 [1,1,1,1,0,1,0,0,0,1], 67 [1,1,1,1,0,1,1,0,0,1], 68 [1,0,0,0,0,1,1,0,0,1], 69 [1,0,0,0,0,0,0,0,0,1], 70 [1,1,1,1,1,1,1,1,1,1] 71 ] 72 kabenokazu = 0 73 for y in range(7): #yは0-6まで繰り返す 74 for x in range(10): 75 if maze[y][x] == 1:#maze[y][x]が1,つまり壁なら灰色の四角を表示させる 76 kabenokazu = kabenokazu+1 77 cv.create_rectangle(x*80,y*80,x*80+80,y*80+80,fill = "skyblue",width = 0) # 78 yukanokazu = 70-kabenokazu #Nmasuに70-yukanokazuを代入 79 img = tk.PhotoImage(file = "meiro.png") 80 cv.create_image(mx*80+40,my*80+40,image = img,tag = "MYCHR") 81 82 main_proc() 83 win.mainloop() 84 85 86#-------------------------------------------------------------------------- 87# rootメインウィンドウの設定 88root = tk.Tk() 89root.geometry("600x600") 90root.title("シュミレーションゲーム") 91canvas0= tk.Canvas(background="#cea", width=600, height=600) 92canvas0.place(x=0, y=0) 93label0= tk.Label(canvas0, text="優秀な子供を育てよう!") 94label0.place(x=300,y=450,anchor=tk.CENTER) 95button = tk.Button(canvas0, text="サブウィンドウ生成", command=sub_window) 96button.place(x=300,y=500) 97root.mainloop() 98
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。