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

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

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

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

解決済

2回答

1080閲覧

Pythonで、referenced before assignmentというエラーが出る

SakuramiKou

総合スコア2

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

0クリップ

投稿2022/09/14 05:19

前提

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

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

投稿2022/09/14 06:38

shiracamus

総合スコア5406

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

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

0

current_line = 0root = tkinter.Tk()の次行などグローバル領域(関数の外)に移動してください。

投稿2022/09/14 05:43

can110

総合スコア38262

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問