【Python(PySimpleGUI)でGUIアプリ入門】ソフトウエアキーボードアプリの作り方。公式Cookbook解説。

PySimpleGUI
けんろう
けんろう

PySimpleGUIでは、ソフトウエアキーボードも自作できます。公式クックブックにデモが載っています。 

この記事では、公式クックブックに載っている、ソフトウエアキーボードを自作する方法を紹介します。

実際に動かしてみると、ちょっと感動します。見た目は、それっぽくできています。ぜひ試してみてください。

この記事に載っているサンプルコードをコピーして、Pythonで実行すれば、簡単に動きを確認できますので、是非試してみて下さい。

この記事では、初心者にもわかりやすいように、各処理の内容を、サンプルコード内にコメントとして載せています。

【無料オンライン】ゼロから始めるPythonプログラミング入門講座(週5開催) テックジム

PySimpleGUIのインストールの仕方は、以下の記事で紹介しています。

スポンサーリンク

ソフトウエアキーボードを表示するアプリ

このアプリは、メインウィンドウと、キーボードウィンドウに分かれています。

メインウィンドウ内に、キーボード表示有無を切り替えるボタンが付いており、これで、キーボードウィンドウを表示できます。

テキスト入力欄をマウスで選択してから、キーボードで文字を打ち込むと、テキスト入力欄に、文字が表示されます。

【AIジョブカレ】人工知能技術専門プログラミングスクール

サンプルコード

#  https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Touch_Keyboard.py

#!usr/bin/env python
# -*- coding: utf-8 -*-

import PySimpleGUI as sg

# キーボードクラスの処理
class keyboard():

    # 初期処理
    def __init__(self, location=(None, None), font=('Arial', 16)):

        self.font = font
        numberRow = '1234567890'
        topRow = 'QWERTYUIOP'
        midRow = 'ASDFGHJKL'
        bottomRow = 'ZXCVBNM'

        # レイアウト
        keyboard_layout = [
            [sg.Button(c, key=c, size=(4, 2), font=self.font) for c in numberRow] + [
                sg.Button('⌫', key='back', size=(4, 2), font=self.font),
                sg.Button('Esc', key='close', size=(4, 2), font=self.font)],
            [sg.Text(' ' * 4)] + [sg.Button(c, key=c, size=(4, 2), font=self.font) for c in
                               topRow] + [sg.Stretch()],
            [sg.Text(' ' * 11)] + [sg.Button(c, key=c, size=(4, 2), font=self.font) for c in
                                midRow] + [sg.Stretch()],
            [sg.Text(' ' * 18)] + [sg.Button(c, key=c, size=(4, 2), font=self.font) for c in
                                bottomRow] + [sg.Stretch()]]

        # ウィンドウの生成
        self.window = sg.Window(
                                        'keyboard', 
                                        keyboard_layout,
                                        grab_anywhere=True,     # どこでもドラッグしてウィンドウを移動できるようにするか
                                        keep_on_top=True,       # 全てのウィンドウの上に作成するか
                                        alpha_channel=0,        # ウィンドウの不透明度(0=非表示、1=完全に表示、0.0-1.0の値で透明度を指定)
                                        no_titlebar=True,       # タイトルバーの表示有無
                                        element_padding=(0, 0),         # ウィンドウ内のパディング幅
                                        location=location,      # 表示座標
                                        finalize=True
                                        )

        # アプリ起動時は、キーボードを隠す
        self.hide()

    # キーボードの処理
    def _keyboardhandler(self):
        
        # イベントの受付
        if self.event is not None:

            # 「Esc」ボタン押下時の処理
            if self.event == 'close':
                # キーボードウィンドウを消す
                self.hide()

            # キーボード押下時の処理
            elif len(self.event) == 1:
                # 選択された要素について、入力された文字で、更新する
                self.focus.update(self.focus.Get() + self.event)

            # 「back」ボタン押下時の処理
            elif self.event == 'back':
                # テキスト入力欄の内容を取得して、一文字消す
                Text = self.focus.Get()
                if len(Text) > 0:
                    Text = Text[:-1]
                    self.focus.update(Text)

    # キーボードウィンドウを消す処理
    def hide(self):
        # 表示履歴をFlaseにセットし、キーボードウィンドウを消す
        self.visible = False
        self.window.Disappear()

    # キーボードウィンドウを表示する処理
    def show(self):
        # 表示履歴をTrueにセットし、キーボードウィンドウを表示する
        self.visible = True
        self.window.Reappear()

    # キーボードウィンドウのトグル処理
    def togglevis(self):
        # 表示履歴=Trueなら、ウィンドウを消す。Falseなら、ウィンドウを表示する
        if self.visible:
            self.hide()
        else:
            self.show()

    # キーボードウィンドウの更新する処理
    def update(self, focus):
        
        # 選択された要素で、更新する。
        self.event, _ = self.window.read(timeout=0)
        if focus is not None:
            self.focus = focus
        self._keyboardhandler()

    # キーボードウィンドウを閉じる処理
    def close(self):
        self.window.close()

# GUIクラスの処理
class GUI():

    # GUIクラスの初期処理
    def __init__(self):

        # レイアウト(1行目:テキスト、2行目:入力、3行目:テキスト入力、4行目:ボタン、5行目:ボタン)
        layout = [  [sg.Text('テキストを入力してください')],
                          [sg.Input('', size=(40, 1), key='input1')],
                          [sg.InputText('', size=(40, 1), key='input2')],
                          [sg.Button('キーボードを表示/非表示', key='keyboard')],
                          [sg.Button('close', key='close')]]

        # ウィンドウの生成
        self.mainWindow = sg.Window(
                                        'On-screen test',       # タイトル文字
                                        layout,
                                        size=(400,200),     # ウィンドウサイズ設定
                                        grab_anywhere=True,     # ウィンドウ内どこでもドラッグできるようにするか=True 
                                        no_titlebar=False,      # タイトルバーの非表示設定=Flase
                                        finalize=True       # Finalizeメソッドが呼び出される。
                                        )

        location = self.mainWindow.current_location()       # ウィンドウの左上の現在座標を取得
        location = location[0]-200, location[1]+200     #キーボードの位置を設定(ウィンドウの現在座標に対し、x-200、y+200の位置にキーボードを配置する)
        self.keyboard = keyboard(location)
        self.focus = None

    # GUIクラスのrunメソッド
    def run(self):
        # イベントループ
        while True:

            # 現在選択されている要素を取得します。要素が見つかられければ何も返りません。
            cur_focus = self.mainWindow.find_element_with_focus()
            if cur_focus is not None:
                self.focus = cur_focus

            # イベントを取得
            event, values = self.mainWindow.read(timeout=200, timeout_key='timeout')

            # GUIウィンドウで選択されている要素(テキスト入力部品)を、キーボードクラスへ渡す
            if self.focus is not None:
                self.keyboard.update(self.focus)

            # 'キーボードを表示/非表示'ボタン押下時の処理
            if event == 'keyboard':
                # キーボード表示履歴をトグルセットする
                self.keyboard.togglevis()

            # 'close'ボタン押下時の処理、ウィンドウ右上の×押下時の処理
            elif event == 'close' or event == sg.WIN_CLOSED:
                break

        # 各種ウィンドウをクローズ
        self.keyboard.close()
        self.mainWindow.Close()


# メイン処理
if __name__ == '__main__':

    # GUIクラスを生成して、run処理を実行する
    app = GUI()
    app.run()

実行すると、

下図のようなウィンドウが立ち上がります。

「キーボードを表示/非表示」ボタンを押すと、キーボードウィンドウが表示されます。

メインウィンドウのテキスト入力欄をマウスで選択して、キーボードウィンドウを使って文字を打ち込むと、テキスト入力欄に文字が表示されます。

「バックSpace」ボタンもあります。ボタンを押すと、直前の文字を一文字消します。

「ESC」を押すと、キーボードを消すことができます。

まとめ

今回は、Pythonライブラリである、PySimpleGUIを使い、ソフトウエアキーボードのアプリの作り方を紹介しました。

コメント

タイトルとURLをコピーしました