あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

PythonとguizeroでGUIアプリケーションを手軽に作ってみる

Raspberry Pi Advent Calendar 6日目です。3枠ほど参加してくださる方が現れてありがてえ〜。皆様のご参加はいつでも歓迎です。

adventar.org

告知も打ってるけど……増えないンゴねえ

PythonとguizeroでGUIアプリを書く?

さて、PythonGUIアプリケーションを書こうとすると、たぶんPyGTKとかPyQtあたりがメジャーになると思うのですが(しらんけど)、guizeroというライブラリがあるらしく、去年あたりにRaspberry Piのブログで「Create Graphical User Interfaces with Pythonって本ができたで!」って出たときに知って、いつかこれでGUIアプリケーションを書いてみたいなと思っていたのでした。

www.raspberrypi.com

guizeroは、TkinterというTkのPython用ライブラリをさらに噛み砕いたようなもの(ラッパーっぽい?)らしく、簡単にGUIアプリケーションが書けるようです。

用意

GUIアプリケーションを書くので、Raspberry PiはDesktop版が必要です。そして、guizeroのインストールはpipコマンドでのインストールします。aptでインストールもできますが、パッケージバージョンが古くてドキュメントと噛み合わないところがあるため、pipでのインストールしたほうが良いです。

sudo apt install python3-pip
sudo pip3 install guizero

Hello, World!

画面を出してなんかテキストとボタンを出して押されたら文字を出したり終わったりするサンプルを書くとこんな感じになります。

import sys
from guizero import App, PushButton, Text

app = App(title="Hello")

def button_clicked():
    clicked_label.clear()
    clicked_label.append("Button clicked!")

def exit_app():
    sys.exit()

Text(app, text="Hello!")
button = PushButton(app, text="NYAN!", command=button_clicked)
button2 = PushButton(app, text="EXIT", command=exit_app)
clicked_label = Text(app, text="")

app.display()

結果はこんな感じ。手軽やん。

f:id:Akkiesoft:20211205230838j:plain

コミケで販売するときのレジアプリ的なのが欲しい

話が突然変わりますが、コミケでは100円玉払い専用投入機を用意したいと思っています。だいぶ昔にヤフオクでコインセレクターをゲットしていて、同人イベントで使おうと思っていたらコロナ禍になってしまい、今冬久々のコミケでは手渡しは非推奨みたいな感じになってるので、今こそ使うチャンスではと思った次第です。ちなみに、500円にも対応していますが、旧500円玉(今年古くなったやつではなく、2000年までの初代のやつ)だけだったので、実質的には使えません。

で、コインセレクターをRaspberry Piにつないで、投入金額の設定とか投入金額のカウントとかをするためのコードを書いていたのですが、なんとなく自販機的というかレジアプリ的というかな感じにしてみたくなり、guizeroでアプリを書いてみました。ドン!

f:id:Akkiesoft:20211205231846j:plain

本の表紙などの商品画像がボタンになっていて、欲しいものを欲しいだけタップすると画面右のリストに追加されて、合計金額が表示されます。ちなみに商品リストはjsonファイルで書かれているので簡単に増やせます。増やしすぎると画面からはみ出しますが。

支払いボタンを押すと、画面が切り替わって支払い方法を選択できます。100円玉以外のときはコイントレーか、久々に使おうと準備中のSquare(VISA/MASTERカード払い可。JCBSuicaは審査中)で支払いしてもらう感じになります。

f:id:Akkiesoft:20211205233249j:plain

100円玉を選択すると投入画面になるので、100円玉をチャリチャリ入れます。投入されたら投入金額がカウントアップされて、合計額と一緒になったら完了……みたいな感じです。

f:id:Akkiesoft:20211205233339j:plain

以上のコードは書きかけなので、販売記録ファイルの書き込みとか細かい調整とかをやりたく、まだ増える見込みですが、現時点では画面遷移を含めて1スクリプトで書けていて、140行程度で表現できています。すごいやん……。完成したらコードを公開できればと思っているところです。

簡易的なGUIアプリならこれでいいかも

触ってみた感じ、ウィジェットの配置に若干クセがあるような気もしつつ、シンプルで意外とかゆいところも届き、さっくりGUIアプリが書ける面白いライブラリでした。開発中のレジアプリ(仮)の写真でしれっとRaspberry Pi公式ディスプレイを使っているように、タッチスクリーンでももちろん使えるので、対話型のサイネージ作成にもヨサゲです。ちなみにレジアプリ(仮)ではRaspberry Pi 3 A+を使用していますが、メモリが少ないモデルでも問題なく使えるのも強みかもしれません(サイネージ的に使うようにちょっとだけチューニングしてあります。あっきぃのラズピッピいじり4の記事を参照。私もよく参照してる)。

レジアプリの完成品はぜひコミケで見に来てさわってもらえたらと思っています。100円玉を握りしめて12/31の東ホール「テ」23a、こくだランドまで遊びに来てね。

ところで、Squareを使うならレジアプリはそっちでいいんじゃねえかという説があります。どうする!?🤔