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

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

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

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

Python

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

Q&A

0回答

529閲覧

pythonのtkinterでラベルを使って6から0まで表示し、0になったらまた6から始めるといった処理をしたいです。

tera877

総合スコア9

Tkinter

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

Python

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

0グッド

0クリップ

投稿2022/11/25 04:35

編集2022/11/25 04:56

前提

pythonのtkinterをつかって簡易的なタイピングゲームを作っています。
全体的な動きはできており、一度ゲームが終了したら、ウィンドを閉じるのではなく、タイトルに戻るというボタンを作って何回でもプレイできるようにしたいです。

そのため、制限時間なども0になったら終了と同時に、次のプレイのために制限時間をもう一度設定しなおさなければいけません。

問題は56行目です。timer_numという変数に数字を入れて、timer_labelというラベルの数字と同じだったら
-1秒するといった処理をしています。なので2週目のために、main()(ゲームが終了したら戻ってくるところ)のところで最初の変数定義と同様に、timer_num = 6にして、timer_labelのテキストも6にしました。二つの数字が一致しているため、一週目と同じように-1秒されてほしいのですが、6で止まってしまいます。

実現したいこと

2週目以降のゲーム中の制限時間のカウントダウンを、1週目と同様の動きにしたいです。

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

該当のソースコード

python

1 2import tkinter as tk 3import random 4 5root = tk.Tk() 6root.geometry("1200x600") 7root.title("タイピングゲーム") 8 9words1 = ["オムライス", "流れ星", "おままごと", "チワワ", "オーストリア", "ベット", 10 "バスタオル", "日焼け止め", "パパイヤ", "みそ汁" ,"マグロ", "落ち葉", 11 "紙コップ", "クリーム", "空手家", "教科書", "アルバイト", "桃アイス", 12 13"イチゴミルク", "キツツキ", "キャベツ", "ごみ箱", "おしぼり", "ヘルメット"] 14words2 = ["omuraisu", "nagarebosi", "omamagoto", "tiwawa", "o-sutoria", "betto", 15 "basutaoru", "hiyakedome", "papaiya", "misosiru", "maguro", "otiba", 16 "kamikoppu", "kuri-mu", "karateka", "kyoukasyo", "arubaito", "momoaisu", 17 "itigomiruku", "kitutuki", "kyabetu", "gomibako", "osibori", "herumetto"] 18 19num_list = random.sample(range(24), 24) #乱数リスト 20index = 0 21count_num = 4 #スタートのカウントダウン 22timer_num = 6 #残り時間 23word_count = 0 #タイプワード数 24 25word_label1 = tk.Label(text=words1[num_list[index]], foreground="#66CCFF", font=("",40)) #平仮名 26word_label2 = tk.Label(text=words2[num_list[index]], foreground="#66CCFF", font=("",40)) #ローマ字 27ans_label = tk.Label(text="", font=("",60)) #キー入力の受け取り 28time_left_label = tk.Label(text="残り時間: 秒", font=("",20)) #残り時間 29timer_label = tk.Label(text=6, font=("",20)) 30word_count_label = tk.Label(text=f"タイプワード数:{word_count}", font=("",20)) 31end_label = tk.Label(text="終了!!", font=("",50)) #終了画面 32score_label = tk.Label(text=f"あなたのタイプワード数は{word_count}です", font=("",30)) #スコア 33count_label = tk.Label(text=4, font=("",100)) #スタートのカウントダウン 34rule_label = tk.Label(text="スタートボタンを押すとカウントダウンが始まりまり、3秒後にゲームが始まります。\ 35\nゲームが始まると、タイプワードが表示されるので、タイピングを始めてください。\n\n \ 36ヒントとしてローマ字が表示されていますが、\n打ち込んだローマ字と異なっていてもタイプワードが打ち込めていれば大丈夫です。", font=("",20)) 37 38#####初期画面##### 39def main(): 40 title_label.pack(ipady=60) 41 rule_button.place(x=750, y=300) 42 start_button.place(x=250, y=300) 43 44 return_button.pack_forget() #タイトルに戻るボタンの非表示 45 rule_label.pack_forget() 46 end_label.pack_forget() 47 score_label.pack_forget() 48 end_button.pack_forget() 49 50 global word_count 51 global timer_num 52 53 word_count = 0 54 word_count_label.configure(text=f"タイプワード数:{word_count}") 55 ans_label.configure(text="") 56 timer_num == 6 57 timer_label.configure(text=6) 58 59#####タイプ画面##### 60def type_screen(): 61 word_label1.pack(ipady=60) 62 word_label2.pack() 63 ans_label.pack(ipady=40) 64 time_left_label.place(x=0, y=0) 65 timer_label.place(x=140, y=0) 66 word_count_label.place(x=0, y=50) 67 68 timer() 69 70#####残り時間の表示と終了時の関数呼び出し##### 71def timer(): 72 global timer_num 73 74 if timer_num == timer_label["text"]: 75 timer_num -= 1 76 timer_label.configure(text=timer_num) 77 78 if timer_num > 0: 79 root.after(1000, timer) 80 81 elif timer_num == 0: 82 timer_label.place_forget() 83 end() 84 85#####終了時の間数##### 86def end(): 87 word_label1.pack_forget() 88 word_label2.pack_forget() 89 ans_label.pack_forget() 90 time_left_label.place_forget() 91 #timer_label.place_forget() 92 word_count_label.place_forget() #タイプ画面のウィジェットの非表示 93 94 end_label.pack(ipady=60) 95 score_label.pack(ipady=30) 96 end_button.pack(ipady=10) 97 98#####スタートのカウントダウン##### 99def countdown(): 100 start_button.place_forget() 101 title_label.pack_forget() 102 rule_button.place_forget() #初期画面の非表示 103 104 count_label.pack(expand=True) 105 global count_num 106 107 if count_num == count_label["text"]: 108 count_num -= 1 109 count_label.configure(text=count_num) 110 111 if count_num > 0: 112 root.after(1000, countdown) 113 114 elif count_num == 0: 115 count_label.pack_forget() 116 count_num = 4 117 count_label.configure(text=count_num) 118 type_screen() 119 120#####遊び方の説明画面##### 121def rule(): 122 start_button.place_forget() 123 title_label.pack_forget() 124 rule_button.place_forget() #初期画面の非表示 125 126 rule_label.pack() 127 return_button.pack() 128 129title_label = tk.Label(text="タイピングゲーム", font=("",50)) #タイトル 130rule_button = tk.Button(text="遊び方", font=("",30), command=rule) #遊び方ボタン 131start_button = tk.Button(text="スタート", font=("",30), command=countdown) #スタートボタン 132return_button = tk.Button(text="タイトルに戻る", font=("",30), command=main) #タイトルに戻るボタン 133end_button = tk.Button(text="タイトルに戻る", font=("",30), command=main) 134 135#####キー入力##### 136def type_event(event): 137 global index 138 global word_count 139 text = ans_label["text"] 140 length = len(event.keysym) #入力キーの文字数 141 142 if event.keysym == "BackSpace": 143 ans_label["text"] = text[:-1] 144 145 elif event.keysym == "minus": 146 ans_label["text"] += "-" 147 148 elif length >= 2: 149 ans_label["text"] += "" 150 151 else: 152 ans_label["text"] += event.keysym 153 154 if ans_label["text"] == word_label2["text"]: 155 ans_label.configure(text="") 156 word_count += 1 157 index += 1 158 word_label1.configure(text=words1[num_list[index]]) 159 word_label2.configure(text=words2[num_list[index]]) 160 word_count_label.configure(text=f"タイプワード数:{word_count}") 161 162 if word_count >= 20: 163 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は100点です!\n達人レベルのタイピング力を持っています!") 164 165 elif word_count >= 15: 166 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は80点です!") 167 168 elif word_count >= 10: 169 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は60点です!") 170 171 elif word_count >= 5: 172 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は40点です!") 173 174 elif word_count < 5: 175 score_label.configure(text=f"あなたのタイプワード数は{word_count}で、点数は20点です!") 176 177root.bind("<KeyPress>", type_event) #関数とキー入力の紐づけ 178 179main() #初期画面の表示 180 181root.mainloop() 182

試したこと

ゲームが始まる前のカウントダウン(count_numとcount_label)で実現したい操作はできています。(114行目)
そのためゲーム中のカウントダウンでも同じことをしているつもりなのですが、なぜか動きません。

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

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

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

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

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

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

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

y_waiwai

2022/11/25 04:49

このままではコードが読めないので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
tera877

2022/11/25 04:56

ご指摘ありがとうございます。更新しました
退会済みユーザー

退会済みユーザー

2022/11/25 07:57

コピペ時のミスかもしれませんが、timer_num == 6 のところはイコールが1個じゃないと意味のない文になってしまいます。
tera877

2022/11/25 08:53

全く見えていませんでした。その部分を直したら動きました。本当に助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問