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

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

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

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

Python

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

Q&A

解決済

1回答

367閲覧

pythonで重複なしのリストを、tkinterを使って画面に表示させると一文字だけ重複してしまいます。

tera877

総合スコア9

Tkinter

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

Python

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

0グッド

0クリップ

投稿2022/11/28 01:43

前提

pythonで簡易的なタイピングゲームを作っています。randomモジュールを使ってnum_listという整数の乱数を24個格納したリストを宣言します。この時点でprintを使ってnum_listを表示させると、しっかり0~23までの整数がランダムな順番になって格納されています。

ここまではいいのですが、それをインデックスとした単語を画面に表示させると不具合が起きます。というのも、ゲームをスタートして初めに、num_listの0番目のインデックス(数字そのものが0というわけではなく)を持つ整数が、word_listのインデックスに割り当てられます。

つまり、printでnum_listを表示させたときの一番先頭の整数nがword_listでn番目の単語を持ってきて、一番初めに画面に表示されるわけなのですが、それがうまく処理できずに、一番初めに表示されるべき単語にならず、他の単語になってしまいます。なので、num_listの先頭のインデックスをもつ1番目の単語が表示されずに他の単語が表示されるので、本来の他の単語の順番に回ってきたときに重複します。

説明が下手で申し訳ありません。

■■な機能を実装中に以下のエラーメッセージが発生しました。

エラーは発生していませんが、num_listで0番目のインデックスを持つ整数を保持し、その整数番目の単語をword_listから持ってきて一番初めに表示したいです。とにかく、最初の単語が正しく表示され、単語の重複なしにゲームができるようにしたいです。

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

エラーメッセージ

該当のソースコード

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 if word_count >= 20: 221 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は100点です!\n達人レベルのタイピング力を持っています!") 222 223 elif word_count >= 15: 224 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は80点です!") 225 226 elif word_count >= 10: 227 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は60点です!") 228 229 elif word_count >= 5: 230 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は40点です!") 231 232 elif word_count < 5: 233 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は20点です!") 234 235root.bind("<KeyPress>", type_event) #関数とキー入力の紐づけ 236 237main() #初期画面の表示 238 239root.mainloop()

試したこと

正しく表示されないのは、決まって一番最初に選ばれた単語です。その単語が、別の単語に置き換わってしまうため、本来別の単語が表示されなければいけない順番が来たときに、重複します。それ以外は問題ありません。
繰り返しですが、num_listそのものは重複していません。画面表示の際に重複が生まれます。

本当にわかりにくい説明で申し訳ありませんが、アドバイスいただけるとありがたいです。

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

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

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

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

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

TakaiY

2022/11/28 02:03

質問の内容がコードと合っていないのでわかりにくいです。 - word_list という変数がコードのなかにありません。 どの変数のことを指していますか? - 「ゲームをスタートして初めに、num_listの0番目のインデックス(数字そのものが0というわけではなく)を持つ整数が、word_listのインデックスに割り当てられます。」 の処理をしているのはどこですか? その処理をしている関数(もしくは処理)とそれを呼び出しているところを教えてください。
guest

回答1

0

ベストアンサー

num_listの内容を2回設定しているからです。
プログラム開始後、以下のように初期化
num_list = random.sample(range(24), 24) #乱数リスト

その後で、num_listの先頭をインデックスとしてラベルに単語を入れる。
word_label1 = tk.Label(text=words1[num_list[index]], foreground="#66CCFF", font=("",40)) #平仮名

main()関数が呼ばれ、その中で再び num_listの内容を乱数で設定している。
num_list = random.sample(range(24), 24) #乱数リスト

ここで内容が変ってしまうので、0番目だけ違うということになる。

投稿2022/11/28 02:14

TakaiY

総合スコア12769

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

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

tera877

2022/11/28 04:19

理解できました。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問