見出し画像

100日アプリ開発チャレンジDay35 -  日本語入力という「無理ゲー」に敗北 して、禁断の「別ウィンドウ召喚」に 手を染めた話


Day35、IMEという壁に激突した日

100日チャレンジ35日目。今日は、昨日作った「カラーパレット管理ツール」の技術を使って、「付箋アプリ」を作っていました。

(昨日は座標地獄だった...今日こそは、楽に...)

「付箋なんだから、文字が打てなきゃただの四角形でしょ」

そう思って、キーボード入力を受け取るコードを書きました。

event.unicodeを取得して、文字を足していく。英語で「Hello」と打ってみる。画面に「Hello」と出る。

「なんだ、楽勝じゃん!」

そう思ったのが、今日最後の笑顔でした。

(フラグ、立った)


画像
完成!!

アプリの操作方法

  • 左クリック:新しい付箋を作成

  • ドラッグ:付箋を移動

  • ダブルクリック:テキストを編集(別ウィンドウが開く)

  • 右クリック:付箋を削除

  • 目標:デスクトップに付箋を貼り付けて情報管理

英語しか打てない呪い

「よし、じゃあ日本語テスト」

キーボードの「半角/全角」キーを押して、日本語入力モードにする。「こんにちは」と打とうとして、「k」「o」「n」…とキーを叩く。

シーン……。

画面には何も表示されません。変換候補のウィンドウも出ません。PCがフリーズしたのかと思いました。

(え...?)

もう一度、「k」「o」「n」。

シーン……。

(なんで...?)

でも、「半角/全角」を押して英語モードに戻すと、「test」とかは打てるんです。「英語は打てるけど、日本語入力にした瞬間、キー入力を一切受け付けなくなる」

なんだこれ??? ここは日本だぞ???

(本日2回目の逆ギレ)

1時間の格闘

英語:Hello → 表示される。

日本語:こんにちは → 何も起きない。

(なぜ...?)

コードを見直します。event.unicode。これで文字を取得してる。でも、日本語入力モードだと、何も入ってこない。

event.key。これも見てみる。英語モードなら、K_aとかK_bとか取れる。日本語モードは...?

何も取れない。

(完全に無視されてる)

printでデバッグしてみます。英語モード:event.type=768(キーダウン)、event.unicode='h'。

日本語モード:何も出ない。イベント自体が来てない。

(これ、バグ...?)

1時間、格闘しました。でも、ダメでした。

犯人は「IME」

調べてみると、どうやらPygameのウィンドウ内で、日本語入力(IME)を扱うのは「修羅の道」らしいのです。OSごとに挙動が違うとか、変換中のイベント処理が複雑すぎるとか、ライブラリのバージョンによるとか…。

「ただ…付箋に…『会議』って書きたいだけなのに…」

(それだけなのに...)

IME。Input Method Editor。日本語入力システム。「あ」と打って「亜」に変換する、あのシステム。

Pygameは、IMEに対応してない。正確には、対応はしてるけど、使うのが難しすぎる。

(無理ゲー...)

数時間粘りました。でも、私の技術力では、Pygameの画面内で「あ」という文字を、変換ウィンドウを出して入力させることはできませんでした。

文字入力って、こんなに高度な技術だったの…?

(当たり前だと思ってた...)

無力感

Day33、ボタンを作りました。center=self.rect.center。30分かかりました。

Day34、ボタンを並べました。座標調整に3時間かかりました。

Day35、日本語を打ちたい。できません。

(技術力、足りない...)

「あ」。たった1文字。でも、打てない。

(無力すぎる...)

禁断の解決策:Tkinter召喚

心が折れかけたその時、悪魔的な(というか泥臭い)アイデアが降ってきました。

「Pygameの画面で打てないなら、打てる画面を出せばいいじゃない」

(マリー・アントワネット...?)

そう、WindowsやMac標準の「あの入力画面」を無理やり呼び出すのです。Pythonにはtkinterという、GUIを作る標準ライブラリがあります。これを使えば、普通の入力ダイアログが出せるはず。

プライドを捨てて実装した「禁断の魔法」がこちらです。

import tkinter as tk
from tkinter import simpledialog

def input_text_dialog(current_text=""):
    """ダイアログで日本語テキスト入力(別ウィンドウが開く!)"""
    root = tk.Tk()
    root.withdraw()  # メインウィンドウは隠す(恥ずかしいから)
    
    # 禁断の「別窓」召喚!!
    result = simpledialog.askstring(
        "テキスト入力", 
        "付箋のテキストを入力してください:", 
        initialvalue=current_text
    )
    root.destroy()
    return result

そして、付箋をダブルクリックした瞬間に、この関数を呼び出すようにしました。

root.withdraw()。メインウィンドウを隠す。恥ずかしいから。

(本当に恥ずかしい...)

simpledialog.askstring()。別ウィンドウ召喚。

(これしか、方法がない...)

結果:ダサいけど…打てる!!

恐る恐る付箋をダブルクリック。すると、ゲーム画面の上に、見慣れた「灰色で地味な入力ウィンドウ」がポン!と出てきました。

(きた...!)

「会議」と打って、Enter。ウィンドウが消え、付箋の上に「会議」の文字が!!

「かった……(勝った)」

(日本語、打てた...!)

見た目は完全にアウトです。おしゃれなアプリ画面から、急にWindows 98みたいなダイアログが出てくるんですから。世界観も何もあったもんじゃない。

(ダサい...超ダサい...)

でも、日本語が打てる。漢字も変換できる。「会議」「予定」「買い物リスト」。全部、打てます。

今の私には、それだけで十分でした。

(機能、最優先)

見た目の犠牲

付箋アプリ。パステルカラーの可愛い付箋。ドラッグで移動できる。

そして、ダブルクリックすると...

灰色の、Windows 98みたいな、地味な入力ダイアログ。

(世界観、崩壊)

でも、動く。日本語が打てる。

(それが、大事)

Day35を終えて:今日の教訓

「正攻法が無理なら、裏口(別ウィンドウ)から入ればいい」

かっこ悪くても、動けば正義です。

(でもいつか、ちゃんとした入力フォーム作りたいなぁ…)

IME。日本語入力システム。Pygameでは、扱うのが難しい。というか、ほぼ無理。

だから、別の方法。Tkinter。別ウィンドウ。

(泥臭い...でも、これが現実)

Day33、ハードルを下げました。「四角が出れば勝ち」。

Day34、ハードルを下げました。「重なってなければヨシ」。

Day35、方法を変えました。「別ウィンドウでもいい」。

(完璧主義、捨てた)

ダサい。世界観崩壊。Windows 98。

でも、日本語が打てる。付箋に「会議」と書ける。

(それで、勝ち)

明日の私へ

明日は...もう少し、見栄えのいいものを作りたいです。

(今日はダサかった...)

でも、今日も、進みました。日本語入力。できました。

(小さな勝利)

おやすみなさい。また明日!

(明日は、もっと綺麗に...)


今日の開発データ

  • 開発時間:約5時間(うちIMEと格闘に2時間)

  • 実装した機能:付箋アプリ、ドラッグ移動、テキスト入力(別ウィンドウ)

  • Pygame内での日本語入力:失敗

  • Tkinter召喚:成功

  • 世界観の崩壊度:100%

  • でも日本語入力:できた

  • 学んだこと:正攻法が無理なら裏口から、かっこ悪くても動けば正義

100日チャレンジ、Day36に続く。

(明日こそ、綺麗に...)


#100日チャレンジ #Python #プログラミング初心者 #ツール開発 #Pygame #Tkinter #日本語入力 #IME #付箋アプリ #個人開発

いいなと思ったら応援しよう!

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
100日アプリ開発チャレンジDay35 -  日本語入力という「無理ゲー」に敗北 して、禁断の「別ウィンドウ召喚」に 手を染めた話|ki-kyo | 未経験×AIでアプリ開発を100日継続中
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1