oky2484811
@oky2484811 (いら)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

タイピングゲームを作りたい

プログラミング初心者です。タイピングゲームを作りたく、Webサイトで公開されているコードを切り貼りして作成しています。
以下のコードを
1.問題を長文にして30秒で何文字打てるかのゲームにしたい
2.回答を平仮名で打てるようにしたい
3.打ったひらがなが正解であれは一文字ずつ赤色で上書き、
間違いであれば青色で表示し、正解の文字が入力されるまで
青色のまま入力まち
4.30秒たったら入力できた文字数を表示して終了

へと変更したいです。

タイピング練習実行画面

import tkinter as tk
from tkinter import messagebox
import sys
import time
import threading

QUESTION = ['いちいち うとうととしてめがさめると\nおんなはいつのまにか、となりのじいさんとはなしをはじめている。\nこのじいさんはたしかにまえのまえのえきからじょうったいなかものである。\nはっしゃまぎわにとんきょうなこえをだしてかけこんできて、\nいきなりはだをぬいだとおもったらせなかにおきゅうのあとがいっぱいあったので、\nさんしろうのきおくにのこっている。\nじいさんがあせをふいて、はだをいれて、\nおんなのとなりにこしをかけたまでよくちゅういしてみていたくらいである。\n おんなとはきょうとからのあいのりである。']

class Application(tk.Frame):
def init(self, master):
super().init(master)
self.pack()

    master.geometry("1000x800")
    master.title("タイピングゲーム!")

    # 問題数インデックス
    self.index = 0

    # 正解数カウント用
    self.correct_cnt = 0

    self.create_widgets()

    # 経過時間スレッドの開始
    t = threading.Thread(target=self.timer)
    t.start()

    # Tkインスタンスに対してキーイベント処理を実装
    self.master.bind("<KeyPress>", self.type_event)

# ウィジェットの生成と配置
def create_widgets(self):
    self.q_label = tk.Label(self, text="お題:", font=("",20))
    self.q_label.grid(row=5, column=0)
    self.q_label2 = tk.Label(self, text=QUESTION[self.index], width=100, anchor="w", font=("",15))
    self.q_label2.grid(row=5, column=1)
    self.ans_label = tk.Label(self, text="解答:", font=("",20))
    self.ans_label.grid(row=10, column=0)
    self.ans_label2 = tk.Label(self, text="", width=10, anchor="w", font=("",20))
    self.ans_label2.grid(row=10, column=1)
    self.result_label = tk.Label(self, text="", font=("",20))
    self.result_label.grid(row=15, column=0, columnspan=2)

    # # 時間計測用のラベル
    self.time_label = tk.Label(self, text="", font=("",20))
    self.time_label.grid(row=8, column=0, columnspan=2)

    self.flg2 = True

# キー入力時のイベント処理
def type_event(self, event):
    # 入力値がEnterの場合は答え合わせ
    if event.keysym == "Return":
        if self.q_label2["text"] == self.ans_label2["text"]:
            self.result_label.configure(text="正解!", fg="red")
            self.correct_cnt += 1
        else:
            self.result_label.configure(text="残念!", fg="blue") 

        # 解答欄をクリア
        self.ans_label2.configure(text="")

        # 次の問題を出題
        self.index += 1
        if self.index == len(QUESTION):
            self.flg = False
            self.q_label2.configure(text="終了!")
            messagebox.showinfo("リザルト", f"あなたのスコアは{self.correct_cnt}/{self.index}問正解です。\nクリアタイムは{self.second}秒です。")
            sys.exit(0)
        self.q_label2.configure(text=QUESTION[self.index])

    elif event.keysym == "BackSpace":
        text = self.ans_label2["text"]
        self.ans_label2["text"] = text[:-1]

    else:
        # 入力値がEnter以外の場合は文字入力としてラベルに追記する
        self.ans_label2["text"] += event.keysym

def timer(self):
    self.second = 0
    self.flg = True
    while self.flg:
        self.second += 1
        self.time_label.configure(text=f"経過時間:{self.second}秒")
        time.sleep(1)

if name == "main":
root = tk.Tk()
Application(master=root)
root.mainloop()

def set_ime_status_win32(hwnd, status=1):
"""日本語入力をonにする(windows用)"""
import ctypes
try:
imm32 = ctypes.windll.imm32
except FileNotFoundError:
return

try:
    himc = imm32.ImmGetContext(hwnd)
    imm32.ImmSetOpenStatus(himc, status)
finally:
    imm32.ImmReleaseContext(hwnd, himc)

import tkinter as tk

root = tk.Tk()
entry = tk.Entry(root)
entry.pack()

自分でやってみた中では
AttributeError: 'Application' object has no attribute 'set_ime_status_win32'
等のエラーが多発し、何を直したらいいのかわからない状態です。
自分でやってみてコードがごちゃごちゃになってしまったので、一番最初の状態で投稿しています。

0

1Answer

マークダウンを使ってちゃんと コードブロックで囲ってください。Pythonはインデントに意味がある言語なので読みづらいです。

0Like

Your answer might help someone💌