
PySimpleGUIでは、ソフトウエアキーボードも自作できます。公式クックブックにデモが載っています。
この記事では、公式クックブックに載っている、ソフトウエアキーボードを自作する方法を紹介します。
実際に動かしてみると、ちょっと感動します。見た目は、それっぽくできています。ぜひ試してみてください。
この記事に載っているサンプルコードをコピーして、Pythonで実行すれば、簡単に動きを確認できますので、是非試してみて下さい。
この記事では、初心者にもわかりやすいように、各処理の内容を、サンプルコード内にコメントとして載せています。
PySimpleGUIのインストールの仕方は、以下の記事で紹介しています。
ソフトウエアキーボードを表示するアプリ
このアプリは、メインウィンドウと、キーボードウィンドウに分かれています。
メインウィンドウ内に、キーボード表示有無を切り替えるボタンが付いており、これで、キーボードウィンドウを表示できます。
テキスト入力欄をマウスで選択してから、キーボードで文字を打ち込むと、テキスト入力欄に、文字が表示されます。


サンプルコード
# 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を使い、ソフトウエアキーボードのアプリの作り方を紹介しました。
デイトラは総受講者数30,000人超の、Webスキルを学べる国内最大規模のオンラインスクールです。
動画コンテンツを見ながら自習を行い、わからないところをチャットツールで質問を行うという形式で学習を行います。そのため、時間・場所を選ばず自分のペースで学習できます。
デイトラ最大の特徴はフリーランスや副業を意識したコースを中心としていることです。Web系フリーランスに必要なスキルを学べるコースを備えており、実際に多数の受講生がフリーランスとなっています。
<オススメポイント>
1. フリーランス/副業を意識したカリキュラム
デイトラは運営陣が全員元フリーランスで、フリーランス向けメディア「東京フリーランス」の運営も行っています。そのためフリーランスに求められるスキル感や現在の流行、そして案件獲得の方法にまで精通しており、カリキュラムにもそのノウハウを反映しています。
「何かを作れるようになる」といった漠然としたゴールではなく、「実際に仕事を受けられるレベルに達する」ことをゴールとしているため、カリキュラムは非常にハイレベルです。
■提供中のコース一覧
・Web制作コース
・Webアプリ開発コース
・Webデザインコース
・Shopifyコース
・動画制作コース
・Pythonコース
・Webマーケティングコース
・AIライティングコース
・Javaコース
2. 受講生による好意的な口コミ
デイトラはTwitter・ブログともに受講生による好意的な口コミが非常に多いです。
カリキュラムやウェビナーなどのサービスの質に満足する声や、実際に案件を獲得できた・転職に成功したなどの成果報告が多数見られます。実際に受講した方の満足する声が多いからこそ、それを見た人が安心して受講に踏み切られています。
デイトラが一年間で8000人以上から受講してもらえたのも、口コミで人が人を呼ぶ構造になっているのが最大の要因です。
3. 圧倒的なコストパフォーマンス
デイトラは一年間のサポート付きで99,800円と格安でサービスを提供しています(例:Web制作コース)。一般的なプログラミングスクールが数十万円の受講料でサポート期間も三ヵ月ほどであることが多いため、それらに比べて非常に安価な価格設定となっています。
さらに、卒業後はカリキュラムの閲覧が不可になるスクールも多い中、デイトラは一度受講したらその後もカリキュラムを見放題です。カリキュラムは随時アップデートされるため、「常に最新の情報を提供してくれる教材」として活用される方も多いです。
デイトラは完全オンラインで教室を持たないスクールで、受講生の口コミによる集客が中心となっています。そのため固定費・広告費を抑え、格安でサービス提供を行えています。
デイトラ



M5Stack
小さな筐体の中に、ディスプレイ、ボタン、無線通信モジュールなど、必要な機能が詰め込まれたモジュールです。メーカから提供されるライブラリも豊富で、初心者の初めてのプログラミングにぴったりです。5 cm四方のベーシックなモデルの他、小型スティック型のモデル、更に小型のATOMシリーズ、M5Stampシリーズなどがあります。
コメント