けんろう
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を使い、ソフトウエアキーボードのアプリの作り方を紹介しました。
- 【PythonでGUIアプリ入門】PySimpleGUI、Pyperclip を使った クリップボードアプリ の作り方
- 【PythonでGUIアプリ入門】PySimpleGUI を使った タイマーストップアプリ の作り方
- 【Python(PySimpleGUI)でGUIアプリ入門】Pythonアプリを起動するランチャソフトの作り方
- 【PythonでGUIアプリ入門】OpenCV、PySimpleGUIによるPCカメラ映像を使った映像加工アプリの作り方
- 【PythonでGUIアプリ入門】OpenCV、PySimpleGUIで、PCカメラで撮影した映像を表示するアプリの作り方
リンク
コメント