PySimpleGUIで数値入力テキストボックスを作る(1)

はじめに

作成中のアプリの中で数値だけ入力を受け付けるInputBoxを作りたいなと思ったのですが、

PySimpleGUIのCookbookの情報を元に作ってみました。

なんかもう少しやりようがある気もしますが、

コーディングの勉強も含めて必要な機能は自分で実装してみます。

実装したい処理

【必須】

数値しか入力できない。・・・今回実装

最大値の設定ができる。

最小値の設定ができる。

【出来れば】

4桁以上の入力でカンマ区切りになる。カンマ区切りの表示にするかどうかは任意で設定できる。

実際のコード

とりあえず実際書いてみたコードはこちら。

# -*- coding: utf-8 -*-

import PySimpleGUI as sg
import re

sg.theme('Dark Blue 3')
layout = [
    [sg.Text('表示速度(0.1〜10.0)', size=(15, 1)), sg.InputText('1.0', key='-SPEED-', enable_events=True, size=(20, 1))],
]

# ウィンドウ生成
window = sg.Window('数値入力テスト', layout)

while True:
    event, values = window.read()

    if event is None:
        print('exit')
        break

    # 表示速度入力時イベント
    if event == '-SPEED-' and values['-SPEED-']:
        try:
            in_as_float = float(values['-SPEED-'])
        except:
            if len(values['-SPEED-']) == 1 and values['-SPEED-'][0] == '-':
                continue
            #正規表現
            print(str(values['-SPEED-']))
            pattern=r'([+-]?[0-9]+\.?[0-9]*)'
            num = re.findall(pattern, str(values['-SPEED-']))
            window['-SPEED-'].update(''.join(num))

# ウィンドウ破棄
window.close()

こんなのでいいのか感はありますが、とりあえず目先の目標の数値入力だけはしてくれてます。

ただ今の作りだと入力によってはマイナス入力受け付けて欲しくないのに、受け付けてしまったり、

頭にいくらでも0を入力ができてしまったりするので、そこは早く改善していかなければ。

基本的な作りとしてはCookbookの以下記事を参考にしています。

The Original PySimpleGUI Cookbook - PySimpleGUI Documentation

上記記事の「Recipe – Input Validation」箇所を参考にしています。

ただ、上記実装だと文字列中に数値以外の文字を入力してしまった場合、

入力箇所の後ろの数値が消えてしまっていたので、数値と-(マイナス), .(小数点)を残すように正規表現で入力可能な文字列以外を削除するよう適用してみました。

使用したのはfindallメソッドでテキストボックスの文字列を正規表現で入力可能な文字列のみを残し、

findallメソッドの戻り値としてlistで返ってくるので結合して画面に表示しています。

これでいいのか感は拭えませんが、とりあえず動いているのでヨシ。

最後に

とりあえず数値だけ入力できる数値入力テキストボックスの作成をすることができました。

なんだかC#でWPFとかWindowsFormとかでアプリ作ってたときの自作でコントロール作ってた時を思い出しました。

懐かしいな・・・、久々にC#触りたくなってきた。

C#で何がしたいかというと特にないんですけど、やるとしたらUnityかな。

まだ実装したい機能が実装しきれていないのでそこは時間があるときに少しずつ実装していきます。

最近仕事が忙しくなってきていて勉強の時間があまり取れていないので、記事が短かったり更新頻度が少なかったりするかもしれないですが、なるべく更新していきたいのでよろしくお願いします。

とりあえず今日はこの辺で。

それでは〜

コメント

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