質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

660閲覧

Python tkinterでのエラー

bvcdhsl

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/10 04:38

前提・実現したいこと

サブウインドウで一筆書きのゲームを作成したいです。
メインウインドウで実行は出来るのですが、サブウインドウに組み込む際にエラーが発生します。

発生している問題・エラーメッセージ

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/11/10 05:09

なにも試していないようですが、 エラーメッセージの意味は理解されていますか。
bvcdhsl

2021/11/10 05:11

理解していません。
guest

回答1

0

python

1 win.after(100,main_proc)

のafterによって登録されたmain_procが実行されるときにmazeが見えないのでしょう。

python

1def sub_window():

python

1def sub_window(): 2 global maze

に変更して、mazeをグローバル変数にしましょう。

投稿2021/11/10 09:31

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bvcdhsl

2021/11/10 09:48

回答ありがとうございます。 def sub_window(): global maze mazeをグローバル変数にしたのですが、エラーが出ました。 どうしたらいいですか? NameError: name 'maze' is not defined
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問