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

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

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

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

Python

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

Q&A

解決済

pythonので関数と変数の関係が分かりません。

tera877
tera877

総合スコア5

Tkinter

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

Python

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

2回答

0グッド

0クリップ

287閲覧

投稿2022/11/27 14:25

編集2022/11/27 14:41

前提

pythonのtkinterを使って、簡易的なタイピングゲームを作っています。"susi"と"sushi"のように違うローマ字でも入力ができるようにコードを書きました。その処理はできているのですが、タイピング中に左上に現れるタイプワード数という、タイプしたワードを数える変数があります。その変数を、ゲームが終了した後に表示されるように関数内に処理を書いたつもりなのですが、終了画面でタイプワード数がおかしくなってしまいます。関数は140行目のtype_settinguという関数です。

■■な機能を実装中に以下のエラーメッセージが発生しました。
type_settingという関数を用いたら、終了した後の画面でのタイプワード数の表示がおかしくなってしまいました。あなたのタイプワード数は{}です。というところです。

ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

タイプ画面中にカウントされているタイプワード数を、終了画面で正確に表示したいです。

該当のソースコード

python

1import tkinter as tk 2import random 3 4root = tk.Tk() 5root.geometry("1200x600") 6root.title("タイピングゲーム") 7 8words1 = ["オムライス", "流れ星", "おままごと", "チワワ", "オーストリア", "ベット", 9 "バスタオル", "日焼け止め", "パパイヤ", "みそ汁" ,"マグロ", "落ち葉", 10 "七夕", "クリーム", "空手", "蝶", "アルバイト", "桃アイス", 11 "イチゴ", "タヌキ", "キャベツ", "ごみ箱", "おしぼり", "ヘルメット"] 12words2 = ["omuraisu", "nagarebosi", "omamagoto", "tiwawa", "o-sutoria", "betto", 13 "basutaoru", "hiyakedome", "papaiya", "misosiru", "maguro", "otiba", 14 "tanabata", "kuri-mu", "karate", "tyou", "arubaito", "momoaisu", 15 "itigo", "tanuki", "kyabetu", "gomibako", "osibori", "herumetto"] 16 17num_list = random.sample(range(24), 24) #乱数リスト 18index = 0 19count_num = 4 #スタートのカウントダウン 20timer_num = 31 #残り時間 21word_count = 0 #タイプワード数 22 23word_label1 = tk.Label(text=words1[num_list[index]], foreground="#66CCFF", font=("",40)) #平仮名 24word_label2 = tk.Label(text=words2[num_list[index]], foreground="#66CCFF", font=("",40)) #ローマ字 25ans_label = tk.Label(text="", font=("",60)) #キー入力の受け取り 26time_left_label = tk.Label(text="残り時間: 秒", font=("",20)) #残り時間 27timer_label = tk.Label(text=31, font=("",20)) 28word_count_label = tk.Label(text=f"タイプワード数:{word_count}", font=("",20)) 29end_label = tk.Label(text="終了!!", font=("",50)) #終了画面 30score_label = tk.Label(text=f"あなたのタイプワード数は{word_count}です", font=("",30)) #スコア 31count_label = tk.Label(text=4, font=("",100)) #スタートのカウントダウン 32rule_label = tk.Label(text="スタートボタンを押すとカウントダウンが始まります。\ 33\nゲームが始まると、タイプワードが表示されるので、タイピングを始めてください。\n\n \ 34ヒントとしてローマ字表記のお題が表示されていますが、\n打ち込んだローマ字と異なっていてもタイプワードが打ち込めていれば大丈夫です。", font=("",20)) 35hint_label = tk.Label(text = "例: nagarebosi → nagareboshi \nどちらでもok", font=("",40)) 36 37#####初期画面##### 38def main(): 39 title_label.pack(pady=60) 40 rule_button.place(x=750, y=300) 41 start_button.place(x=250, y=300) 42 43 return_button.pack_forget() #タイトルに戻るボタンの非表示 44 rule_label.pack_forget() 45 end_label.pack_forget() 46 score_label.pack_forget() 47 end_button.pack_forget() 48 hint_label.pack_forget() 49 50 global word_count 51 global timer_num 52 global index 53 global num_list ###########################################################################################ランダムになってない 54 55 word_count = 0 56 word_count_label.configure(text=f"タイプワード数:{word_count}") 57 ans_label.configure(text="") 58 timer_num = 31 59 timer_label.configure(text=31) 60 index = 0 61 num_list = random.sample(range(24), 24) #乱数リスト 62 63#####タイプ画面##### 64def type_screen(): 65 word_label1.pack(pady=60) 66 word_label2.pack() 67 ans_label.pack(pady=40) 68 time_left_label.place(x=0, y=0) 69 timer_label.place(x=140, y=0) 70 word_count_label.place(x=0, y=50) 71 72 timer() 73 74#####残り時間の表示と終了時の関数呼び出し##### 75def timer(): 76 global timer_num 77 78 if timer_num == timer_label["text"]: 79 timer_num -= 1 80 timer_label.configure(text=timer_num) 81 82 if timer_num > 0: 83 root.after(1000, timer) 84 85 elif timer_num == 0: 86 timer_label.place_forget() 87 end() 88 89#####終了時の間数##### 90def end(): 91 word_label1.pack_forget() 92 word_label2.pack_forget() 93 ans_label.pack_forget() 94 time_left_label.place_forget() 95 #timer_label.place_forget() 96 word_count_label.place_forget() #タイプ画面のウィジェットの非表示 97 98 end_label.pack(pady=60) 99 score_label.pack(pady=30) 100 end_button.pack(pady=10) 101 102#####スタートのカウントダウン##### 103def countdown(): 104 start_button.place_forget() 105 title_label.pack_forget() 106 rule_button.place_forget() #初期画面の非表示 107 108 count_label.pack(expand=True) 109 global count_num 110 111 if count_num == count_label["text"]: 112 count_num -= 1 113 count_label.configure(text=count_num) 114 115 if count_num > 0: 116 root.after(1000, countdown) 117 118 elif count_num == 0: 119 count_label.pack_forget() 120 count_num = 4 121 count_label.configure(text=count_num) 122 type_screen() 123 124#####遊び方の説明画面##### 125def rule(): 126 start_button.place_forget() 127 title_label.pack_forget() 128 rule_button.place_forget() #初期画面の非表示 129 130 rule_label.pack(pady=20) 131 hint_label.pack(pady=20) 132 return_button.pack(pady= 30) 133 134title_label = tk.Label(text="タイピングゲーム", font=("",50)) #タイトル 135rule_button = tk.Button(text="遊び方", font=("",30), command=rule) #遊び方ボタン 136start_button = tk.Button(text="スタート", font=("",30), command=countdown) #スタートボタン 137return_button = tk.Button(text="タイトルに戻る", font=("",30), command=main) #タイトルに戻るボタン 138end_button = tk.Button(text="タイトルに戻る", font=("",30), command=main) 139 140def type_setting(): 141 global word_count 142 global index 143 ans_label.configure(text="") 144 word_count += 1 145 index += 1 146 word_label1.configure(text=words1[num_list[index]]) 147 word_label2.configure(text=words2[num_list[index]]) 148 word_count_label.configure(text=f"タイプワード数:{word_count}") 149 150#####キー入力##### 151def type_event(event): 152 global index 153 global word_count 154 text = ans_label["text"] 155 length = len(event.keysym) #入力キーの文字数 156 157 if event.keysym == "BackSpace": 158 ans_label["text"] = text[:-1] 159 160 elif event.keysym == "minus": 161 ans_label["text"] += "-" 162 163 elif length >= 2: 164 ans_label["text"] += "" 165 166 else: 167 ans_label["text"] += event.keysym 168 169 if ans_label["text"] == word_label2["text"]: 170 type_setting() 171 172 elif word_label2["text"] == "nagarebosi": 173 if ans_label["text"] == "nagareboci" or ans_label["text"] == "nagareboshi": 174 type_setting() 175 176 elif word_label2["text"] == "betto": 177 if ans_label["text"] == "bextuto" or ans_label["text"] == "beltuto": 178 type_setting() 179 180 elif word_label2["text"] == "misosiru": 181 if ans_label["text"] == "misociru" or ans_label["text"] == "misoshiru": 182 type_setting() 183 184 elif word_label2["text"] == "otiba": 185 if ans_label["text"] == "ochiba": 186 type_setting() 187 188 elif word_label2["text"] == "kuri-mu": 189 if ans_label["text"] == "curi-mu": 190 type_setting() 191 192 elif word_label2["text"] == "karate": 193 if ans_label["text"] == "carate": 194 type_setting() 195 196 elif word_label2["text"] == "tyou": 197 if ans_label["text"] == "tilyou" or ans_label["text"] == "tixyou": 198 type_setting() 199 200 elif word_label2["text"] == "itigo": 201 if ans_label["text"] == "ichigo": 202 type_setting() 203 204 elif word_label2["text"] == "kyabetu": 205 if ans_label["text"] == "kilyabetu" or ans_label["text"] == "kixyabetu": 206 type_setting() 207 208 elif word_label2["text"] == "gomibako": 209 if ans_label["text"] == "gomibaco": 210 type_setting() 211 212 elif word_label2["text"] == "osibori": 213 if ans_label["text"] == "oshibori" or ans_label["text"] == "ocibori": 214 type_setting() 215 216 elif word_label2["text"] == "herumetto": 217 if ans_label["text"] == "herumextuto" or ans_label["text"] == "herumeltuto": 218 type_setting() 219 220 221 if word_count >= 20: 222 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は100点です!\n達人レベルのタイピング力を持っています!") 223 224 elif word_count >= 15: 225 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は80点です!") 226 227 elif word_count >= 10: 228 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は60点です!") 229 230 elif word_count >= 5: 231 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は40点です!") 232 233 elif word_count < 5: 234 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は20点です!") 235 236root.bind("<KeyPress>", type_event) #関数とキー入力の紐づけ 237 238main() #初期画面の表示 239 240root.mainloop()

試したこと

169行目のみに関数を使って処理する前するとはこのようなことは起こりませんでした。しかし、他の文字でも打てるような条件(172行目から218行目)の部分に関数を使うと、終了時の画面がおかしくなってしまいます。そのため、関数そのものはしっかり動いているはずなのですが、使いどころによっておかしくなってしまうみたいです。

以下のような質問にはグッドを送りましょう

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

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

TakaiY

2022/11/27 14:37

行番号は不安定なので「140行目の関数」ではなく関数名にしてください。また、「172行目から218行目」とは具体的にどこなのか明記してください。 また、変更する前のコードとそのコードをどのような意図で変更したのかを書いていただけると、アドバイスしやすいと思います。

回答2

0

ベストアンサー

ざっと見たところ、

python

1 if word_count >= 20:

以降のインデントはおかしいように思います。
これ以降のインデントを4つ減らす必要がありそうです。

それで、問題が全て解決するとは思いませんが。

投稿2022/11/27 14:53

TakaiY

総合スコア10557

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

tera877

2022/11/27 15:12

インデントを調整したらしっかりと処理できました。本当にありがとうございます。 質問の仕方についても親切に教えていただきありがとうございます。以後気を付けようと思います。

0

関数を使って処理する前までの状態に戻して問題を切り分けてください。ちきんたぁの問題もあるかもしれません

投稿2022/11/27 14:31

unti

総合スコア72

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

2022/11/27 15:18

こちらの回答が他のユーザーから「説明が不足している回答」という指摘を受けました。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

Tkinter

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

Python

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