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 #付箋アプリ #個人開発


コメント