irakoma
@irakoma (いら)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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

プログラミング初心者です。タイピングゲームを作りたく、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

3Answer

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

1Like

タイピングゲームを作りたく、Webサイトで公開されているコードを切り貼りして作成しています。

自分でやってみてコードがごちゃごちゃになってしまったので、一番最初の状態で投稿しています。

誰かが書いたコードをまるごとコピーして投稿されているのでしょうか?転載OKなコードなのでしょうか?そうであっても引用元は明示された方が良いかと思います。

またやりたことに対して現状はどうなっているのかを簡潔に追記いただけると回答がつきやすくなるかと思います。

0Like

まず最後にあったエラーの意味は、Applicationのクラス内に
set_ime_status_win32というメゾッド(属性)が存在しないという意味です。
このエラーについて調べると、関数の誤字・脱字で存在しない
関数等を呼び出そうとすると発生します(最初にエラーの内容調べなかったんでしょうか)

コードがごちゃごちゃになってしまったので、一番最初の状態で
投稿しているとのことですが、この最初の状態の中に
set_ime_status_win32を呼び出すような記述がありません。
エラーが出た状態のコードをちゃんと投稿してください。

0Like

Your answer might help someone💌