[Python]PySimpleGUIで何かを起動するボタンを作る方法
今回も、前回同様にPythonでGUIが簡単に作れるPySimpleGUIというサードパーティーライブラリの紹介です。
PythonでGUIと言えば標準ライブラリのTkinterが有名ですが、PySimpleGUIはTkinterなどのラッパーライブラリです。Tkinterで実現できる機能を、より少ないコードで書けるようにしているものです。
今回は、Webへのリンクを仕込んだボタンをGUIに配置してみました。サンプルのできあがりはこんな感じです。
ライブラリのインストール
PySimpleGUIはサードパーティー製のライブラリなので、最初はインストールが必要です。既にインストール済みの場合は不要です。
# Windowsの場合
pip install PySimpleGUI
# macOS / Linuxの場合
pip3 install PySimpleGUI
Anaconda環境の場合はcondaでのインストールでもよいかと思います。
モジュールインポート
以下のようにインポートします。
import webbrowser
import PySimpleGUI as sg
今回はWebブラウザを起動するので、webbrowserというライブラリもインポートしています。webbrowserはPythonの標準ライブラリですので、インポートするだけで使えます。
GUIの要素配置設定
次に、ボタンの配置設定です。PySimpleGUIは、二次元リストで要素を平面に配置していくイメージです。今回は3つしかボタンがないので1行3列に並べています。
sg.Textはテキストの配置で、sg.Buttonはボタンの配置です。ボタンは文字列引数がそのままボタンの表示名になります。
# ウィンドウ配置
layout = [[
sg.Text('サイトリンク', font=('メイリオ', 10), auto_size_text=True),
sg.Button('Google'),
sg.Button('隣IT'),
sg.Button('note'),
]]
こうすると、横に並びます。
(注:この時点ではGUIは生成できません。完成形のイメージです。)
二次元リストの書き方を変えると、配置も変わります。以下は3行1列の配置です。位置合わせとか考えなくても、適当に合わせてくれます。
# ウィンドウ配置
layout =[
[sg.Text('サイトリンク', font=('メイリオ', 10), auto_size_text=True)],
[sg.Button('Google')],
[sg.Button('隣IT')],
[sg.Button('note')]
]
GUIウィンドウ作成
次に、ボタンを配置するためのウィンドウを設定します。ウィンドウのタイトルバーに表示する文字列と、先程設定した配置リストを引数として渡します。
# ウィンドウ作成
window = sg.Window('リンク集', layout)
イベント設定(ボタンを押した時の動作)
次に、ボタンを押した時の動作を定義していきます。
# イベントループ
while True:
event, _ = window.read() # イベント読み取り(ここでイベント待ち)
if event == 'Google':
webbrowser.open('https://www.google.com/')
if event == '隣IT':
webbrowser.open('https://tonari-it.com/')
if event == 'note':
webbrowser.open('https://note.com/hotta3216/')
if event == None:
break
ウィンドウのオブジェクトに対してread()というメソッドを実行すると、ウィンドウの情報を読み取ります。(実際は動作を待っている状態)
read()メソッドは2要素のタプルを返します。1要素目(変数event)はイベント名で、今回は押したボタン名(sg.Buttonで設定した引数)が代入されます。
ウィンドウ右上の✕ボタンが押されるとNoneが返ってくるので、whileループから抜けて終了させる処理を最後に入れています。
read()メソッドの返り値タプルの2要素目はウィンドウの戻り値です。例えばテキストボックスなどの場合に入力した値を返すのですが、今回はボタンだけで値を返すものがないので、変数名に「_(アンダースコア)」を設定して値を捨てていることを明示しています。
(使用しない変数名をアンダースコア1文字にするのはPythonの慣例です)
変数eventの内容をif文で判定して、Webブラウザをオープンしています。最初にインポートしたwebbrowser.open(URL)で、指定したURLのページが標準ブラウザで開きます。
この機能は、以下の記事を参考にしました。今回はブラウザ起動ですが、PC上のアプリケーション起動やフォルダを開くのも可能です。
コード全体
これで完成です。コード全体は以下になります。
import webbrowser
import PySimpleGUI as sg
# ウィンドウ配置
layout = [[
sg.Text('サイトリンク', font=('メイリオ', 10), auto_size_text=True),
sg.Button('Google'),
sg.Button('隣IT'),
sg.Button('note'),
]]
# ウィンドウ作成
window = sg.Window('リンク集', layout)
# イベントループ
while True:
event, _ = window.read() # イベント読み取り(ここでイベント待ち)
if event == 'Google':
webbrowser.open('https://www.google.com/')
if event == '隣IT':
webbrowser.open('https://tonari-it.com/')
if event == 'note':
webbrowser.open('https://note.com/hotta3216/')
if event == None:
break
ただ、このコードはあまりよろしくありません。前半で設定したボタン名がイベント名として返ってくるのですが、ボタンを増やしたり名前を変えたりすると、後半のif文で同じように書き換える必要があり、ミスによるエラーの原因になります。
ということで、ボタン名とURLを辞書型で設定してみました。辞書はfor文でループできます。これなら最初の辞書(変数dict_link)を変更するだけでボタン配置処理とイベント処理の両方が同時に反映されるため、ボタンの変更や追加が楽になります。
コード全体(改良版)
import webbrowser
import PySimpleGUI as sg
# リンク用辞書作成
dict_link = {
'Google': 'https://www.google.com/',
'隣IT': 'https://tonari-it.com/',
'note': 'https://note.com/hotta3216/',
}
# ウィンドウ配置
layout = [
[sg.Text('サイトリンク', font=('メイリオ', 10), auto_size_text=True)] +
[sg.Button(name) for name in dict_link.keys() ],
]
# ウィンドウ作成
window = sg.Window('リンク集', layout)
# イベントループ
while True:
event, _ = window.read() # イベント読み取り(ここでイベント待ち)
for name, url in dict_link.items():
if event == name:
webbrowser.open(url)
continue
if event == None:
break
まとめ
今回は、Webブラウザを起動するボタンをGUIで配置してみました。URLで指定できるので、Googleスプレッドシートなども直接開けます。
Webのリンクボタンだけだと、ただのブックマークなのであまり使い所はありませんが、こちらを参考にすればアプリケーションやファイル・フォルダも開けるので、ランチャーみたいな使い方も出来ると思います。
また、他のGUI要素と組み合わせても便利です。私は、Webスクレイピングの結果をGUI上にリスト表示するツールに、スクレイピングしたもとのサイトのURLをボタンに追加することで、スクレイピングの概要をGUIリストで確認し、詳細はブラウザで見る。みたいな使い方をしています。
こんな感じで、複数の自治体の図書館で借りてる本の一覧を表示し、延長したいときにその図書館のサイトに飛べるようにしています。地味に便利。
参考サイト
前回記事
PySimpleGUI公式
その他(ググれば他にもそれなりに出てきます)
こちらはpdfでまとまってます。
途中でも紹介した、PythonからアプリケーションやWebブラウザを開く方法