【初心者向け】KivyによるWindowsアプリ作成23 キーボードからの入力受付の実装

今回から数回に分けて、キーボードから文字をタイプされた時の処理を少しずつ実装していきたいと思います。

まず今回は、キーボードからタイプされた文字を受け取る処理そのものを実装します。

コード全量については、GitHubにアップしたファイルをご参照下さい。

<スポンサーリンク>

キー入力受付処理の概要

キー入力の受付処理を実行するためには、4つほど踏むべきステップがあり、まずはその流れを説明したいと思います。

①Keyboradインスタンスの生成

キーボード操作を管理するための基礎となる、Keyboardクラスのインスタンスを生成します。インスタンス生成の際の引数には、③のキーボードからの入力受付を終了する際の処理を行うメソッドを指定する必要があります。

②キー入力時の処理メソッド紐付け

キーボードからの入力が行われた際に行う処理をまとめたメソッドを、生成したKeyboardインスタンスに紐づけます。メソッドそのものは、④で作成します。

③キーボード操作終了時のメソッド作成

Keyboradインスタンス生成時に必要となる、キーボード操作終了時に実施するメソッドを作成します。

④キー入力時のメソッド作成

キーボードからタイプされた際の処理をまとめたメソッドを作成します。

では、順に実装していきましょう。

実装

①Keyboardインスタンスの生成

まず、キーボードを用いた処理を行うために必要となる、Windowというクラスをインポートします。

#省略
from random import choice
from kivy.clock import Clock
from kivy.core.window import Window #追加
#省略

次に、Keyboardインスタンスを生成します。インスタンスの生成は、ゲーム処理を開始するタイミングで行いたいため、GameScreenクラスのstartメソッド内に記述します。

class GameScreen(Screen):
    def start(self):
        self.targetExist = [[False for i in range(10)] for j in range(7)]

        self.keyboard = Window.request_keyboard(self.keyboardClosed, self) #追加

        Clock.schedule_interval(self.update, 1.0/1.0)

Keyboardインスタンスの生成には、Windowクラスのrequest_keyboardメソッドを使います。1つ目の引数、keyboardClosedは、前述のキーボード入力受付を終了する際に実施するメソッドです。メソッド名に決まったものはなく、任意のもので結構です。

このメソッドの中身については③で作成します。

そして、生成されたKeyboardインスタンスをkeyboardという変数に代入する、というのが、追加した処理です。

②キー入力時の処理メソッド紐付け

次に、Keyboardインスタンス生成直後に、キー入力が行われた際に実施するメソッドをこのインスタンスに紐付けます。

class GameScreen(Screen):
    def start(self):
        self.targetExist = [[False for i in range(10)] for j in range(7)]

        self.keyboard = Window.request_keyboard(self.keyboardClosed, self)
        self.keyboard.bind(on_key_down=self.keyboardDown) #この行をさらに追加

        Clock.schedule_interval(self.update, 1.0/1.0)

処理の紐づけには、Keyboardインスタンスの中のbindというメソッドを使います。

使い方ですが、「keyboard.bind(イベント名=メソッド名)」という記述で、記載されたイベント発生時に実行するメソッドを指定します。

今回イベント名には「on_key_down」というものが指定されていますが、これは、「キーが押される」というイベントを表しており、この名称は固定です

なお、参考まで、他にキーボード操作で使用できるイベントには「on_key_up」というものがあり、これは、「キーが離される」というイベントを意味します。

③キーボード操作終了時のメソッド作成

続いて、キーボード操作終了時のメソッドを作成しますが、これはGameScreen内のメソッドとして作成します。当然ながら、メソッド名は①で指定した名称に合わせる必要があることに注意して下さい。

class GameScreen(Screen):
    def start(self):
#省略

    def update(self, dt):
#省略

    def keyboardClosed(self): #このメソッドを追加
        self.keyboard.unbind(on_key_down=self.keyboardDown)
        self.keyboard = None

メソッドの中身ですが、まず9行目で、②で行った「キーが押された際の実行メソッドの紐づけ」を「unbind」というメソッドにて解消しています。

続く10行目で、Keyboardインスタンスが入っていたkeyboard変数を初期化しています。

④キー入力時のメソッド作成

最後にキーがタイプされた際に実行したい処理を、メソッドとして作成します。メソッドの中身について、今回はこのメソッドの動作を理解するためのテスト的なコードを入れておき、本格実装は次回行うものとします。

まずは、GameScreenクラス内に、以下のようにメソッドを記述して下さい。

class GameScreen(Screen):
    def start(self):
#省略

    def update(self, dt):
#省略

    def keyboardClosed(self): 
#省略

    def keyboardDown(self, keyboard, keycode, text, modifiers): #このメソッドを追加
        print("keyboard value: %s" % keyboard)
        print("keycode value: %s , %s" % (keycode[0], keycode[1]))
        print("text value: %s" % text)
        print("modifiers value: %s" % modifiers)

今回追加されたメソッドが、Keyboardインスタンスのon_key_downイベントに紐づけられているために、キータイプの都度実行されるわけですが、重要なのは引数です。

on_key_downイベントに紐づけられたメソッドには、以下4つの引数を指定する必要があります。

引数名 内容
keyboard 生成されたKeyboardインスタンスの格納場所(メモリ上の番地)
keycode 各キーに対応する番号と、それに対応する文字の2つの値を入れたタプル
text タイプされた文字
modifiers 文字と、shiftやctrlキーなどの修飾キーが同時に押されている場合、その修飾キーの種類(修飾キーが押されていない場合は空)

これら引数の値は、キータイプ時に自動的にKivyプログラムにより取得されます。

そして、各引数について、説明だけではイメージが掴みづらいと思いますので、キータイプ時に各引数に何が入るのかを見えるようにしたのが、12~15行目の記述です。

基本的には単純に各引数の内容を表示しているだけですが、1点だけ補足説明します。

print文内の「”」または「’」で括った文字列の中に「%s」を入れ、さらにその後に「,」で区切って「% 変数名」を記載することにより、文字中の%sの位置に、指定した変数の値を埋め込んで表示することができます

例えば、12行目の「print(“keyboard value: %s” % keyboard)」という記述では、「keyboard value: 」という文字列に続いて、keyboard変数の値が表示されます。

なお、%sは複数指定することも可能で、その場合は13行目のように、タプル形式で表示したい変数を渡してやります。

また、%sは表示したい変数が文字列型の場合に使える表現で、例えば整数型の変数の値を表示したい時には、代わりに「%d」を使います。

実行

それでは、ここまで実装した内容を、プログラムを実行することによって確認してみましょう。なお、atom-runnerを使ってプログラムを実行すると、print文による表示がプログラム終了時にまとめて行われますので、リアルタイムにタイプされた内容を確認するため、Anaconda Promptからプログラムを実行して下さい

(kivy)>python mian.py

プログラムを実行し、ゲームを開始してキーをいくつか押してみて下さい。modifiers変数に代入される内容を確認するため、shiftキーやctrlキーを押しながらその他の文字を押すという操作も行って頂ければと思います。

やってみて、キータイプの都度、Anaconda Prompt上にタイプされたキーの情報が表示されることが確認できれば、プログラムの更新は完了です。

keyboard value: <kivy.core.window.Keyboard object at 0x0000022AC08C6590>
keycode value: 97 , a
text value: a
modifiers value: []
keyboard value: <kivy.core.window.Keyboard object at 0x0000022AC08C6590>
keycode value: 304 , shift
text value: İ
modifiers value: []
keyboard value: <kivy.core.window.Keyboard object at 0x0000022AC08C6590>
keycode value: 120 , x
text value: x
modifiers value: ['shift']
keyboard value: <kivy.core.window.Keyboard object at 0x0000022AC08C6590>
keycode value: 9 , tab
text value: None
modifiers value: []
keyboard value: <kivy.core.window.Keyboard object at 0x000002693F7B6590>
keycode value: 303 , rshift
text value: į
modifiers value: []
keyboard value: <kivy.core.window.Keyboard object at 0x000002693F7B6590>
keycode value: 121 , y
text value: y
modifiers value: ['shift']

終わりに

今回は、キーボードからのタイプ内容を受け付ける処理を実装しました。プログラムを実行して各変数の値を確認してみると、これらをうまく使えば、ゲーム画面に表示された文字の消し込みが行えそうだという感触を掴むことができたのではないかと思います。

ということで、次回からは今回の内容を応用し、キータイプ時の処理を本格的に実装していきたいと思います。

<スポンサーリンク>

シェアする

フォローする