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

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

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

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

Python

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

解決済

pythonのtkinterのキー入力イベントで記号を記号名ではなく記号そのもので表示する方法を教えてください。

tera877
tera877

総合スコア5

Tkinter

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

Python

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

1回答

0グッド

0クリップ

215閲覧

投稿2022/11/23 14:01

前提

pythonのtkinterをつかってキーボード入力イベントを試しているのですが、「-」のような記号を打つと「minus」と表現されてしまいます。これを普通に「-」と表現する方法はないですか?

実現したいこと

キー入力イベントで、例えばですが「ハンバーガー」と入力したいとします。
ですが、tkinterでwindowを表示し、ローマ字で「hanba-ga-」と入力すると、画面には「hanbaminusgaminus」と表示されてしまいます。これを「hunba-ga-」と入力できるようにしたいです。

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

試したこと

if event.keysym == "minus":
label["text"] == "-"

というようなコードを試しました。「-」を押したときはしっかりと「-」が表示されます。
しかし、当たり前ですが、それまでに入力していまた物がすべて消えて「-」が表示されます。

tkiterではなく普通のコードでしたら文字列は「+」で結合できますよね?そういったことはtkinterのラベルでは使えるのでしょうか?とにかく、記号を記号名ではなく普通の記号として出力し、かつそれまでにevent.keysymで打ち込んでいた文字を消さずに、そこに追加する形で記号をつけれるようにしたいです。

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

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

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

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

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

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

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

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

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

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

回答1

1

ベストアンサー

質問にソースコードが提示されていないので、以下は推測です。
ソースコードを提示いただければもうちょっと確度の高いことが書けると思います。

if event.keysym == "minus":
label["text"] == "-"
というようなコードを試しました。「-」を押したときはしっかりと「-」が表示されます。
しかし、当たり前ですが、それまでに入力していまた物がすべて消えて「-」が表示されます。

もし、この処理を入れないときに、ラベルにそれまで入力していた文字が追加されているのだとしたら、それまで入力した文字を保持している文字列などか、ラベルにその時点で表示されている文字を取り出して、それに追加するなどの処理をしているはずです。

なので、「ー」を押したときの処理も、ラベルを直接変更するのではなく、既存の処理に沿ったものにすればいいのではないでしょうか。


追記

コメントに貼られてもインデントがわからないので、不正確ですが、推測で。

python

1def type_event(event): 2 global index 3 global word_count 4 ans_label["text"] += event.keysym

やはり、ここで、 「+=」としていますので、「もとのラベルのテキストに押したキーの 「keysym」を追加 する方式ですね。
なので、とりあえずは、「keysimがminusの時は"-"を追加する」という処理を入れるのがいいでしょう。
他の記号に対応させるのであればそれも個別に追加します。

python

1def type_event(event): 2 global index 3 global word_count 4 5 if event.keysym == "minus": 6 ans_label["text"] += "-" 7 else: 8 ans_label["text"] += event.keysym

こんな感じ。

ただ、この関数を見ると、後の方で、

python

1 elif event.keysym == "BackSpace": 2 ans_label["text"] = text[:-10]

このようにBSのときの処理を結果判定の後にやっているのはちょっと違和感がありますね。しかも、「BackSpeca」という文字が足された後なので、その9文字を含めて10文字分消すという仕様はどうかと思います。であれば、追加する前に判定して、1文字消すべきだと思います。

修正するなら、入力のイベントで処理すべきはすべて処理して入力後の文字列を確定してから結果の判定するほうがきれいな処理になるでしょう。

投稿2022/11/23 15:15

編集2022/11/24 11:59
TakaiY

総合スコア10391

spoofy_dragon👍を押しています

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

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

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

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

回答へのコメント

tera877

2022/11/23 15:22

回答ありがとうございます。 今更ですが、ソースコードを張らせていただきます。 import tkinter as tk import random root = tk.Tk() root.geometry("1200x600") root.title("タイピングゲーム") words1 = ["オムライス", "流れ星", "おままごと", "チワワ", "牛乳", "ベット", "バスタオル", "日焼け止め", "パパイヤ", "みそ汁" ,"マグロ", "落ち葉", "紙コップ", "python", "空手家", "教科書", "アルバイト", "桃アイス", "イチゴミルク", "キツツキ", "キャベツ", "ごみ箱", "おしぼり", "ヘルメット"] words2 = ["omuraisu", "nagarebosi", "omamagoto", "tiwawa", "gyuunyuu", "betto", "basutaoru", "hiyakedome", "papaiya", "misosiru", "maguro", "otiba", "kamikoppu", "python", "karateka", "kyoukasyo", "arubaito", "momoaisu", "itigomiruku", "kitutuki", "kyabetu", "gomibako", "osibori", "herumetto"] num_list = random.sample(range(24), 24) #乱数リスト index = 0 count_num = 4 #スタートのカウントダウン timer_num = 31 #残り時間 word_count = 0 #タイプワード数 word_label1 = tk.Label(text=words1[num_list[index]], foreground="#66CCFF", font=("",40)) #平仮名 word_label2 = tk.Label(text=words2[num_list[index]], foreground="#66CCFF", font=("",40)) #ローマ字 ans_label = tk.Label(text="", font=("",60)) #キー入力の受け取り time_left_label = tk.Label(text="残り時間: 秒", font=("",20)) #残り時間 timer_label = tk.Label(text=31, font=("",20)) word_count_label = tk.Label(text=f"タイプワード数:{word_count}", font=("",20)) end_label = tk.Label(text="終了!!", font=("",30)) #終了画面 score_label = tk.Label(text="", font=("",30)) #スコア count_label = tk.Label(text=4, font=("",100)) #スタートのカウントダウン #####初期画面##### def main(): title_label.pack(ipady=60) rule_button.place(x=750, y=300) start_button.place(x=250, y=300) return_button.pack_forget() #タイトルに戻るボタンの非表示 #####タイプ画面##### def type_screen(): word_label1.pack(ipady=60) word_label2.pack() ans_label.pack(ipady=40) time_left_label.place(x=0, y=0) timer_label.place(x=140, y=0) word_count_label.place(x=0, y=50) timer() #####残り時間の表示と終了時の関数呼び出し##### def timer(): global timer_num if timer_num == timer_label["text"]: timer_num -= 1 timer_label.configure(text=timer_num) if timer_num > 0: root.after(1000, timer) elif timer_num == 0: end() #####終了時の間数##### def end(): word_label1.pack_forget() word_label2.pack_forget() ans_label.pack_forget() time_left_label.place_forget() timer_label.place_forget() word_count_label.place_forget() #タイプ画面のウィジェットの非表示 end_label.pack() score_label.pack() #####スタートのカウントダウン##### def countdown(): start_button.place_forget() title_label.pack_forget() rule_button.place_forget() #初期画面の非表示 count_label.pack(expand=True) global count_num if count_num == count_label["text"]: count_num -= 1 count_label.configure(text=count_num) if count_num > 0: root.after(1000, countdown) elif count_num == 0: count_label.destroy() type_screen() #####遊び方の説明画面##### def rule(): start_button.place_forget() title_label.pack_forget() rule_button.place_forget() #初期画面の非表示 return_button.pack() title_label = tk.Label(text="タイピングゲーム", font=("",50)) #タイトル rule_button = tk.Button(text="遊び方", font=("",30), command=rule) #遊び方ボタン start_button = tk.Button(text="スタート", font=("",30), command=countdown) #スタートボタン return_button = tk.Button(text="タイトルに戻る", font=("",30), command=main) #タイトルに戻るボタン #####キー入力##### def type_event(event): global index global word_count ans_label["text"] += event.keysym text = ans_label["text"] length = len(event.keysym) #入力キーの文字数 if ans_label["text"] == word_label2["text"]: ans_label.configure(text="") word_count += 1 index += 1 word_label1.configure(text=words1[num_list[index]]) word_label2.configure(text=words2[num_list[index]]) word_count_label.configure(text=f"タイプワード数:{word_count}") if word_count >= 15: score_label.configure(text=f"あなたのタイプワード数は:{word_count}で、点数は100点です!!") else: score_label.configure(text=f"あなたのタイプワード数は:{word_count}で、点数は80点です!!") elif event.keysym == "BackSpace": ans_label["text"] = text[:-10] #elif length >= 2: #ans_label["text"] = text[:-length] root.bind("<KeyPress>", type_event) #関数とキー入力の紐づけ main() #初期画面の表示 root.mainloop() キー入力系のコードは114行目のdef type_event()のところでかいているので、そこを見ていただけたらありがたいです。ans_labelに入力した文字列が格納されています。実際に実行してみて「ー」のキーを押していただけると、minusと表示されるのでわかると思います。これを「ー」と表示したいです。
TakaiY

2022/11/23 15:28

ソースをここに貼っても読めませんし、訪ずれた人にも見てもらえないでしょう。 質問は編集できますので、そちらに追記おねがいします。
tera877

2022/11/25 04:07

返信が遅れて申し訳ありませんでした。指摘いただいた部分を修正し、実装したかった記号の問題も無事解決できました。本当にありがとうございます。また、このサイトの操作についても教えていただきありがとうございました。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Tkinter

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

Python

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