ラズパイ日記 vol.3:PySimpleGUI を使ってボタンで画像を切り替える GUI アプリを作成してみた(Ver.2)

5 min
スポンサーリンク

前回、ラズパイの GUI アプリを作ってみたものの、納得いく形にもっていくことができなかった。

前回日記:ラズパイ日記 vol.2:GUI アプリを作って Mac から Raspberry Pi に VNC でプログラムファイルを送ってみた

作成当初に僕が思い描いていたGUIアプリは、ラズパイに取り付けた4インチのタッチパネルにフルスクリーンで表示できるというもの。

が、しかし・・・。

RaspberryPiでPythonプログラムを実行④

 

ラズパイのデスクトップ画面のメニューバー、アプリのタイトルバー。この2つが表示されてて、せっかく作った GUI アプリの下側が思いっきり見切れてるやないか!!

テストで作ってみた GUI アプリだったけど・・・

 

よかろう・・・

作り直してやるぞ!

 

Raspberry Pi のメニューバー(タスクバー)の消し方

ひとまず、ラズベリーパイのデスクトップの画面上に表示されるメニューバー(タスクバー)の消し方は以下の通り。

メニューバーを右クリックしてパネルの設定をクリックする。

Raspberry Pi OS のメニューバー(タスクバー)の消し方①

パネル設定の画面を開いたら、高度な設定タブの中にある[使わない時はパネルを最小化する]にチェックをいれる。

Raspberry Pi OS のメニューバー(タスクバー)の消し方②

こうしておけばマウスカーソルを画面上にもっていかなければタスクバーを隠すことができる。

 

 

タイトルバーを消したくて、PySimpleGUI にたどり着く・・・

前回、Pythonに標準で入っている tkinter というライブラリ(モジュール)を使って GUI アプリを作成した。ネットの大海原で調べてみた結果、どうやらこの tkinter のライブラリではタイトルバーを非表示にすることができないらしい。

で、「Python ライブラリ タイトルバー非表示」で検索した結果、ありましたよ!タイトルバーを非表示にできる GUI ライブラリが!!

 

その名も「PySimpleGUI」!

 

早速インストールしてみた。

pip install pysimplegui

PySimpleGUI のインストール

 

 

そして、仕上がったアプリはこちら。(こっからさらに手直ししたので、最終的に出来上がったソースは後述)

GUI テストアプリ完成

 

 

あれ??

タイトルバー

消えてなくね??

 

 

たしかにタイトルバーをなくすために、引数でタイトルバー非表示を指定したんだけど・・・。いや、でもラズパイに入れたらタイトルバー消えるかも・・・。OS違うし。

 

 

よし、実行や!!

 

 

ラズベリーパイでプログラムを実行!

Mac で作ったプログラムファイルを VNC でラズパイに送って、Thonny Python IDE で実行!

Thonny Python IDE でエラー

 

と思ったら、ラズパイの方に PySimpleGUI なんてモジュールがないと叱られる。そりゃそうだ。ラズパイのターミナルで Mac と同じように PySimpleGUI をインストール!!

pip install pysimplegui

ラズベリーパイに PySimpleGUI をインストールする

 

気を取り直して実行!!

 

 

頼む!

タイトルバーよ

消えててくれ

 

 

PySimpleGUI 消えないタイトルバー

 

 

消えてねえええええええええええええええええ

 

 

泣く泣くまたネットの大海原に身を投じて調べた結果、どうも tkinter の不具合かなにかで特定のバージョンでうまくタイトルバーを非表示にすることができないっぽい

PySimpleGUI 🚀 - [質問] * MACユーザー* no_titlebarはあなたのために働いていますか? | bleepcoder.com

 

最終的に GUI テストアプリ Ver.2 はこう仕上がった

他にもいっぱい壁にぶつかったけど、妥協と修正を重ねてとりあえず当初目標に掲げていた「ラズパイのタッチパネルにフルスクリーンで表示させる」アプリが完成した。

妥協点と修正についてはソースコードとともに書き記す。

完成したアプリがこちら。

最終的に完成した GUI テストアプリ Ver.2

 

 

はい、

タイトルバー

消せませんでした

 

 

苦肉の策として、アプリ起動直後にタイトルバーをドロップ&ドラッグで画面の一番上に合わせるという超アナログな方法でここを解決?させた。そして、ウィンドウサイズ(この4インチのタッチパネルは横800px、横480px)をあらかじめタイトルバーの高さも含めた上で縦480pxになるように調整した。これで下の DOWN ボタンが見切れる問題を解消。

タイトルバーをドラッグして真上に

 

ちなみに先ほどおこなったラズパイのデスクトップのメニューバーを隠す設定、これ元に戻して常にメニューバーを表示させるようにしました。

理由は、メニューバーを隠してしまうとタッチパネル操作でメニューバーを出せなくなってしまって、非常に不便になったから。

 

Python のソースコード

以下が今回完成させたアプリのソースコード。普段こんなにコメントを書くことはないけど、僕のように Python を書き始めてまだ間もない初心者の方がこのページを見てくれた時に、どんな処理をしているのかわかるように書いておきます

# ライブラリのインポート
import PySimpleGUI as sg

# テーマを設定
sg.theme('SystemDefaultForReal')

# 画面レイアウト
layout = [
# 1段目に CLOSE ボタンを配置
[sg.Button('CLOSE', size=(7, 1), font=('System', 13), button_color=('white', 'red'))],

# 2段目に UP ボタン配置
[sg.Button('UP', size=(7, 1), font=('System', 20), button_color=('white', 'darkblue'))],

# 3段目に LEFT ボタン、アヒル画像、RIGHT ボタンを配置
[sg.Button('LEFT', size=(7, 1), font=('System', 20), button_color=('white', 'darkblue')),
sg.Image(filename = 'tarasuke1.png', key='ahiru'),
sg.Button('RIGHT', size=(7, 1), font=('System', 20), button_color=('white', 'darkblue'))
],

# 4段目に DOWN ボタンを配置
[sg.Button('DOWN', size=(7, 1), font=('System', 20), button_color=('white', 'darkblue'))],
]

# ウインドウの作成
window = sg.Window('test02.py',
layout, size=(800, 450), # 画面のサイズを縦800px、横450pxに
background_color='white', # 画面全体の背景色を白に
border_depth=0, # 画面上の全てのウィジェットの枠線を非表示に
element_justification=('center'), # 画面上の全てのウィジェットの配置を中央に
element_padding=((15,15),(5,5))) # 画面上の全てのウィジェットの余白を左右5px、上下5pxに
# no_titlebar=True), grab_anywhere=True)

# イベントループ
while True:

event, values = window.read() # イベントの読み取り
if event in (None, 'CLOSE'): # CLOSEボタンを押したら閉じる
break

elif event == 'UP': # UP ボタンを押したら画像切り替え
window['ahiru'].Update(filename = 'tarasuke2.png')

elif event == 'LEFT': # LEFT ボタンを押したら画像切り替え
window['ahiru'].Update(filename = 'tarasuke3.png')

elif event == 'RIGHT': # RIGHT ボタンを押したら画像切り替え
window['ahiru'].Update(filename = 'tarasuke4.png')

elif event == 'DOWN': # DOWN ボタンを押したら画像切り替え
window['ahiru'].Update(filename = 'tarasuke1.png')

# 終了処理
window.close()

 

タイトルバー非表示に関わるところ

ここまでさんざん書いてきて断念したタイトルバーの非表示設定。これは 32行目に記述してあるやつです。結局使えなかったので # でコメントアウトしてます。

no_titlebar=True

 

また、あとに記述している以下の引数。これは画面(ウィンドウ)内をドロップ&ドラッグして位置を移動できるようにする設定です。タッチパネルでボタンを押した瞬間に画面がガクガク揺れてしまうという想定外の誤作動を起こすのでコメントアウト。

grab_anywhere=True

 

タイトルバーを含めたウィンドウサイズ

27行目のところですね。

layout, size=(800, 450), # 画面のサイズを縦800px、横450pxに

タイトルバーの高さを除いた高さである縦450pxにしています。つまりタイトルバーの高さは30px!!

 

あとは、ソース内のコメントに書いてあるから説明不要だと思うのでここまで。

 

次の課題は・・・

ひとまず GUI 画面の作り方とボタンによる画像の切り替え方法がわかったので、次のステップに進むことにする。

次からはいよいよギター練習アプリの作成に乗り出してみようと思う。

次回の日記:ラズパイ日記 vol.4:Raspberry Pi 4 に USB 小型マイクを取り付けて音声を認識させ、録音してみた

 

スポンサーリンク
カテゴリー:
タグ:
関連記事