Q&A
前提
PythonでTkinterライブラリを使用してゲームを制作していたところ
referenced before assignment
というエラーが表示されてしまいました。
実現したいこと
エラー解消
発生している問題・エラーメッセージ
Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\patpw\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__ return self.func(*args) File "c:\Python\untigame\sikou.py", line 101, in start_game decode_line(None) File "c:\Python\untigame\sikou.py", line 14, in decode_line if current_line >=len(scenario): UnboundLocalError: local variable 'current_line' referenced before assignment
該当のソースコード
Python
1import tkinter 2 3#スタートメニュー 4def start_menu(): 5 st_btn = tkinter.Button(text = "はじめる",width = 20,back = "blue") 6 st_btn.place(x = 300,y = 100) 7 #スタートゲーム呼び出し 8 st_btn["command"] = start_game 9 10#シナリオ読み込み 11def decode_line(event): 12 global bgimg, lcharimg, ccharimg, rcharimg 13 #最終行到達で終了 14 if current_line >=len(scenario): 15 return; 16 #行を読み込んで次へ移動 17 line = scenario[current_line] 18 current_line=current_line + 1 19 line=line.replace("\\n","\n").strip() 20 params=line.split(" ") 21 22 if line[0] != "#": 23 message["text"]=line 24 return 25 elif params[0] == "#back": 26 canvas.delete("all") 27 bgimg = tkinter.PhotoImage(file = params[1]) 28 canvas.create_image(450,230,image=bgimg) 29 elif params[0] == "#putChar": 30 if params[2] == "L": 31 canvas.delete("left") 32 lcharimg=tkinter.PhotoImage(file=params[1]) 33 canvas.create_image(200,160,image=lcharimg,tag="left") 34 elif params[2] == "R": 35 canvas.delete("right") 36 rcharimg=tkinter.PhotoImage(file=params[1]) 37 canvas.create_image(700,160,image=lcharimg,tag="right") 38 else: 39 canvas.delete("center") 40 ccharimg=tkinter.PhotoImage(file=params[1]) 41 canvas.create_image(450,160,image=lcharimg,tag="center") 42 43 elif params[0] == "#delChar": 44 if params[2] == "L": 45 canvas.delete("left") 46 elif params[2] == "R": 47 canvas.delete("right") 48 else: 49 canvas.delete("center") 50 elif params[0] == "#branch": 51 message.unbind("<Button-1>") 52 btn = tkinter.Button(text=params[2],width=20) 53 branch.append(btn) 54 btn["command"] = lambda : jump_to_line(int(params[1]) - 1) 55 btn.place(x=300,y=60+int(params[1])*60) 56 jumplabel.append(params[3]) 57 if params[4] == "n": 58 return 59 elif params[0] == "#jump": 60 label = params[1].strip() 61 62 for l in range(len(scenario)): 63 if scenario[l].strip() == "## " + label: 64 current_line = l 65 decode_line(None) 66 return 67 elif params[0].strip() == "#end": 68 message["text"] = "owari" 69 message.unbind("<Button-1>") 70 current_line = 99999999 71 72 decode_line(None) 73 74def jump_to_line(branchID): 75 for btn in branch: 76 btn.place_forget() 77 btn.destroy() 78 branch.clear() 79 label = jumplabel[branchID] 80 jumplabel.clear() 81 message.bind("<Button-1>",decode_line) 82 83 for l in range(len(scenario)): 84 if scenario[l].strip() == "## " + label: 85 current_line = l 86 decode_line(None) 87 return 88 89root = tkinter.Tk() 90root.title("思考述べる") 91root.minsize(900,460) 92root.option_add("*font",["メイリオ",14]) 93 94canvas = tkinter.Canvas(width=900,height=460) 95canvas.place(x=0,y=0) 96 97 98 99#ゲームスタート 100def start_game(): 101 decode_line(None) 102 #ここでcurrent_lineを宣言 103 global current_line 104 current_line = 0 105 global scenario 106 scenario = [] 107 file=open("senario.txt","r",encoding="utf-8") 108 while True: 109 line=file.readline() 110 scenario.append(line) 111 if not line: 112 file.close() 113 break 114 115 global message 116 message = tkinter.Label(width=70,height=5,wraplength=840, 117 bg="white",justify="left",anchor="nw") 118 119 message.place(x=28,y=284) 120 message["text"]="クリックしてスタート" 121 message.bind("<Button-1>",decode_line) 122 123start_menu() 124 125bgimg= None 126lcharimg = None 127ccharimg = None 128rcharimg = None 129branch = [] 130jumplabel = [] 131 132root.mainloop()
試したこと
decode_line関数内でcurrent_lineをグローバル変数として宣言してみると、Name Errorと表示されます。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。