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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

3321閲覧

ラベルを削除したい!

onikudaisuki

総合スコア23

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2020/10/04 08:23

前提・実現したいこと

pythonでおみくじを作りました。入力した数字とランダム数字を足したもので結果を表示しています。10より大きな数字を入力したら再入力を求め、0から10の数字を入力したら「0から10の数字を入力してください。」というラベルを削除したいです。

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

again_text.destroy() UnboundLocalError: local variable 'again_text' referenced before assignment

該当のソースコード

python

1どこから載せればいいか分からないので全部。 2import tkinter 3 4root = tkinter.Tk() 5root.title("運勢占い") 6root.minsize(640, 480) 7root.option_add("*font", ["MS Pゴシック", 22]) 8 9getu = tkinter.PhotoImage(file="大吉.png") 10ka = tkinter.PhotoImage(file="凶.png") 11sui = tkinter.PhotoImage(file="吉.png") 12moku = tkinter.PhotoImage(file="小吉.png") 13 14canvas = tkinter.Canvas(bg="plum", width=640, height=480) 15canvas.place(x=0, y=0) 16img = tkinter.PhotoImage(file="神社.png") 17canvas.create_image(320, 240, image=img) 18 19question = tkinter.Label(text="あなたが入力した数字で今日の運勢を調べます。\n0から10の数字を入力してください。", bg="plum") 20question.place(x=27, y=20) 21 22entry = tkinter.Entry(width=3, bd=7, bg="orchid") 23entry.place(x=289, y=140) 24 25button = tkinter.Button(text="決定") 26button.place(x=280, y=400) 27 28import random 29D = random.randint(0,5) 30 31def btn_click(): 32 a = float(entry.get()) 33 if a > 10: 34 again_text = tkinter.Label(text="0から10の数字を入力してください。",fg="red",bg="plum") 35 again_text.place(x=105,y=30) 36 question.destroy() 37 return 38 if 1 <= a+D <= 3 or a+D == 10: 39 again_text.destroy() 40 res_text = tkinter.Label(text="あなたの今日の運勢は大吉です。",fg="red", bg="plum") 41 res_text.place(x=115, y=20) 42 res_text = tkinter.Label(text="やったね!", bg="plum") 43 res_text.place(x=250, y=425) 44 canvas.delete("all") 45 question.destroy() 46 entry.destroy() 47 button.destroy() 48 canvas.create_image(320, 240, image=getu) 49 if a+D > 10: 50 again_text.destroy() 51 res_text = tkinter.Label(text="あなたの今日の運勢は凶です。",fg="darkviolet",bg="plum") 52 res_text.place(x=120, y=20) 53 res_text = tkinter.Label(text="ざんねーん", bg="plum") 54 res_text.place(x=250, y=425) 55 canvas.delete("all") 56 question.destroy() 57 entry.destroy() 58 button.destroy() 59 canvas.create_image(320, 240, image=ka) 60 if 5 <= a+D <= 8: 61 again_text.destroy() 62 res_text = tkinter.Label(text="あなたの今日の運勢は吉です。",fg="green",bg="plum") 63 res_text.place(x=120, y=20) 64 res_text = tkinter.Label(text="よきかな", bg="plum") 65 res_text.place(x=260, y=425) 66 canvas.delete("all") 67 question.destroy() 68 entry.destroy() 69 button.destroy() 70 canvas.create_image(320, 240, image=sui) 71 if a+D == 4 or a+D == 0: 72 again_text.destroy() 73 res_text = tkinter.Label(text="あなたの今日の運勢は小吉です。",fg="sienna",bg="plum") 74 res_text.place(x=120, y=20) 75 res_text = tkinter.Label(text="まぁまぁかな", bg="plum") 76 res_text.place(x=243, y=425) 77 canvas.delete("all") 78 again_text.destroy() 79 question.destroy() 80 entry.destroy() 81 button.destroy() 82 canvas.create_image(320, 240, image=moku) 83 84button["command"] = btn_click 85root.mainloop()

試したこと

again_text.destroy()を置く場所を変えてみたり、returnもいじってみたりしました。調べてもreturnの使い方が分からないのとエラーメッセージの言ってることもわかりません。

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

Windows10
python3.7.1
vscode

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

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

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

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

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

guest

回答2

0

ベストアンサー

again_textをglobalとして定義します:

again_text = None def btn_click(): global again_text if a > 10: again_text = tkinter.Label(text="0から10の数字を入力してください。",fg="red",bg="plum") again_text.place(x=105,y=30) return

投稿2020/10/04 15:14

timhu

総合スコア27

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

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

onikudaisuki

2020/10/05 11:08

回答ありがとうございました。 やりたいことが出来ました!追加で質問いいですか??一回目10より大きな数字を入力して二回目も10より大きな数字を入力して三回目10より小さな数字を入力すると、「0から10の数字を入力してください」とおみくじ結果のラベル、例えば「あなたの今日の運勢は大吉です。」のラベルが重なってしまいました。この重なりをやめておみくじの結果のラベルだけ表示したいです!良ければ教えてください。
guest

0

エラーについて

まずは、「グーグル翻訳でもいいので何を言われたかを把握する」「ググった上で解説を読む」ことをお勧めします。

UnboundLocalError: local variable 'again_text' referenced before assignment

UnboundLocalErrorが発生する原因

このコードはボタンを押すたびに、btn_clickを実行していますが、変数again_textが定義されているのは入力した内容が10より大きいときだけです。それ以外では定義されていません。
そのため、それ以外の分岐で存在しないagain_textに対する処理をしようとして、エラーになっています。

どうすれば解消するか(1例

考え方

このラベルは、何回か実行されるbtn_clickのたびに状態が変わる可能性があるタイプのものです。
そのため、実行のたびに参照されなくなる関数内の定義ではなく、関数の外で定義したほうが良いものです。
(元コードで定義しているボタン類などと考え方は同じです)

コード例

あくまで1例です。また、その先に機能を増やしたいときのことは特に考慮していません。

※差分のあるところだけ抜粋

diff

1# 定義を外に出す(placeは中のまま) 2+again_text = tkinter.Label(text="0から10の数字を入力してくだい。",fg="red",bg="plum") 3 4import random 5D = random.randint(0,5) 6 7def btn_click(): 8 a = float(entry.get()) 9 if a > 10: 10- again_text = tkinter.Label(text="0から10の数字を入力してくだい。",fg="red",bg="plum") 11 again_text.place(x=105,y=30) 12

投稿2020/10/04 15:06

attakei

総合スコア2740

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

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

onikudaisuki

2020/10/05 11:12 編集

回答ありがとうございました。考え方の所がすごくわかりやすかったです!!この書き方はエラーが起きてしまいました。もうもう一人のお方が解決してくださいました!この問題の解決方法を考えてくれた時間、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問