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

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

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

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

Python

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

解決済

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

SakuramiKou
SakuramiKou

総合スコア2

Tkinter

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

Python

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

2回答

0リアクション

0クリップ

223閲覧

投稿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

import tkinter #スタートメニュー def start_menu(): st_btn = tkinter.Button(text = "はじめる",width = 20,back = "blue") st_btn.place(x = 300,y = 100) #スタートゲーム呼び出し st_btn["command"] = start_game #シナリオ読み込み def decode_line(event): global bgimg, lcharimg, ccharimg, rcharimg #最終行到達で終了 if current_line >=len(scenario): return; #行を読み込んで次へ移動 line = scenario[current_line] current_line=current_line + 1 line=line.replace("\\n","\n").strip() params=line.split(" ") if line[0] != "#": message["text"]=line return elif params[0] == "#back": canvas.delete("all") bgimg = tkinter.PhotoImage(file = params[1]) canvas.create_image(450,230,image=bgimg) elif params[0] == "#putChar": if params[2] == "L": canvas.delete("left") lcharimg=tkinter.PhotoImage(file=params[1]) canvas.create_image(200,160,image=lcharimg,tag="left") elif params[2] == "R": canvas.delete("right") rcharimg=tkinter.PhotoImage(file=params[1]) canvas.create_image(700,160,image=lcharimg,tag="right") else: canvas.delete("center") ccharimg=tkinter.PhotoImage(file=params[1]) canvas.create_image(450,160,image=lcharimg,tag="center") elif params[0] == "#delChar": if params[2] == "L": canvas.delete("left") elif params[2] == "R": canvas.delete("right") else: canvas.delete("center") elif params[0] == "#branch": message.unbind("<Button-1>") btn = tkinter.Button(text=params[2],width=20) branch.append(btn) btn["command"] = lambda : jump_to_line(int(params[1]) - 1) btn.place(x=300,y=60+int(params[1])*60) jumplabel.append(params[3]) if params[4] == "n": return elif params[0] == "#jump": label = params[1].strip() for l in range(len(scenario)): if scenario[l].strip() == "## " + label: current_line = l decode_line(None) return elif params[0].strip() == "#end": message["text"] = "owari" message.unbind("<Button-1>") current_line = 99999999 decode_line(None) def jump_to_line(branchID): for btn in branch: btn.place_forget() btn.destroy() branch.clear() label = jumplabel[branchID] jumplabel.clear() message.bind("<Button-1>",decode_line) for l in range(len(scenario)): if scenario[l].strip() == "## " + label: current_line = l decode_line(None) return root = tkinter.Tk() root.title("思考述べる") root.minsize(900,460) root.option_add("*font",["メイリオ",14]) canvas = tkinter.Canvas(width=900,height=460) canvas.place(x=0,y=0) #ゲームスタート def start_game(): decode_line(None) #ここでcurrent_lineを宣言 global current_line current_line = 0 global scenario scenario = [] file=open("senario.txt","r",encoding="utf-8") while True: line=file.readline() scenario.append(line) if not line: file.close() break global message message = tkinter.Label(width=70,height=5,wraplength=840, bg="white",justify="left",anchor="nw") message.place(x=28,y=284) message["text"]="クリックしてスタート" message.bind("<Button-1>",decode_line) start_menu() bgimg= None lcharimg = None ccharimg = None rcharimg = None branch = [] jumplabel = [] root.mainloop()

試したこと

decode_line関数内でcurrent_lineをグローバル変数として宣言してみると、Name Errorと表示されます。

補足情報(FW/ツールのバージョンなど)

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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Tkinter

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

Python

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