PySimpleGUIのサンプル
ウィンドウ表示
ここでは、単にウィンドウだけを表示させてみます。
ウィンドウのサイズ変更や位置指定なども簡単にできますよ。
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("ウィンドウ表示のサンプル!")],
]
# ウィンドウ作成
window = sg.Window('ウィンドウ名', layout)
event, values = window.read()
print("event", event, flush=True)
print("values", values, flush=True)
# ウィンドウ閉じる
window.close()
Pythonでウィンドウを表示させるには、tkinterなど利用しますが、
PySimpleGUIは直感的で分かりやすいと思ったのでご紹介します。
インストール方法は
pip install pysimplegui
PySimpleGUIは2018年から開発が始まったんですね(最近だぁね)、
tkinter、Qt、WxPython、Remiののラッパーで、少ない行数で書けて直感的かな。
解説
ウィンドウを表示させるだけのコードです、最初は、ウィンドウに配置したい部品を指定します。
layout変数に、リスト型で指定します、階層構造にして行単位に指定ができます。
そして部品には次のようなものがあります。
文字列表示 Text
入力領域 Input
ボタン Button
使う場合は、「sg.Text("表示したい文字列")」のように使います。
layout = [
[sg.Text("Hello")], # 1行目
[sg.Text("Hello2")], # 2行目
]
sg.Windowでウインドウのタイトル、ウインドウに配置したいもの、ウインドウ位置
等を指定します。
window = sg.Window( 'ウィンドウ名', layout, location=(50,50) )
最初の引数はウィンドウのタイトルで、2番目にはウィンドウに表示させたい部品を順番に書けばできます。
locationはウィンドウの座標値です。
ステップアップ
ウインドウのサイズ、位置、サイズ可変の指定のやり方
・ウインドウのサイズを可変にしたい
window = sg.Window("テストウィンドウ", layout, resizable=True)
・ウインドウのサイズを指定
window = sg.Window("テストウィンドウ", layout, size=(200, 100))
・ウインドウの位置を指定
window = sg.Window("テストウィンドウ", layout, location=(100,100))
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("ウィンドウ表示のサンプル!")],
]
# ウィンドウ作成
window = sg.Window('ウィンドウ名', layout)
event, values = window.read()
# ウィンドウ閉じる
window.close()
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("ウィンドウ表示test")],
]
window = sg.Window('テストWin', layout)
event, values = window.read()
window.close()
No1 ウィンドウの基本
ウィンドウの基本的な作成方法です。
リスト型で行ごとにウィンドウ部品を配置していきます。
それを使ってウィンドウのインスタンスを取得して、それを元に情報を取得します。
ポイント
・以下の定型的な処理を作成します
・ウィンドウのレイアウト(layout)
・ウィンドウ作成 sg.Window('ウィンドウ名', layout)
・ウィンドウ情報の取得(read)
・ここでは、event,valuesを取得
・closeを使って、ウィンドウ閉じる
ウィンドウのタイトルを変更するには
# ------------------------------------
# No2 ウィンドウのレイアウト
# ------------------------------------
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("Hello")], # 1行目
[sg.Text("Hello2")], # 2行目
]
# ウィンドウ作成
window = sg.Window("テストウィンドウ", layout )
# ここで、入力された情報、クリックされたボタン情報を取得
# ループさせて使います
event, values = window.read()
# ウィンドウ閉じる
window.close()
# ------------------------------------
# No21 ウィンドウのレイアウト
# ------------------------------------
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("Hello")], # 1行目
[sg.Text("Hello2")], # 2行目
[sg.Text("年齢"), sg.Input(key="key1")], # 3行目
]
# ウィンドウ作成
window = sg.Window("テストウィンドウ", layout )
# ここで、入力された情報、クリックされたボタン情報を取得
# ループさせて使います
event, values = window.read()
# ウィンドウ閉じる
window.close()
No2 ウィンドウ内のレイアウト
ウィンドウ内の部品の配置のやり方を見てみましょう!
ポイント
・layoutの変数にリスト型で部品を指定していく
ラベルと入力域を3行目に追加するには
# ------------------------------------
# No3 ウィンドウ位置、サイズの指定、リサイズ可能
# ------------------------------------
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("ウィンドウ表示のサンプル")],
]
window = sg.Window("テストウィンドウ", layout )
window.read()
window.close()
# ------------------------------------
# No31 ウィンドウ位置、サイズの指定
# ------------------------------------
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("ウィンドウ表示のサンプル")],
]
# ウィンドウの位置は、locationでタプルで指定
window = sg.Window("テストウィンドウ", layout, location=(0,0))
window.read()
window.close()
# ------------------------------------
# No32 ウィンドウ位置、サイズの指定
# ------------------------------------
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("ウィンドウ表示のサンプル")],
]
# ウィンドウのサイズは、sizeでタプルで指定
window = sg.Window("テストウィンドウ", layout, size=(500, 100))
window.read()
window.close()
# ------------------------------------
# No33
# ------------------------------------
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("ウィンドウ表示のサンプル")],
]
# リサイズを可能にする
window = sg.Window("テストウィンドウ", layout, resizable=True)
window.read()
window.close()
No3 ウィンドウの配置、サイズを指定
ポイント
・ウィンドウ作成で、locationでウィンドウの表示位置を指定
・sizeでウィンドウのサイズを指定
・ウィンドウのリサイズを行えるようにするには、resizable=True
(ウィンドウの四隅にカーソルを移動すると、アイコンが表示される)
ウィンドウの位置を、(0, 0)にするには
ウィンドウのサイズを、幅,縦 (500,100)にするには
ウィンドウのリサイズを可能にするには
トライ
ボタンを追加して見ましょう!
「はい」と「終了」ボタンを追加してみます。
次のコードをコピペして PyCatで動作確認してみて下さい。
PyCatのエディタ部分では「Ctrl+x」,[Ctrl+c],[Ctrl+v]使えますので、コード修正後に「exec」をクリックするとウィンドウが表示されます。
(少し表示が遅いです...)
print文で表示される、event, valuesがどうなりますか?
print("event", event, flush=True)
print("values", values, flush=True)
# ウィンドウのレイアウト
layout = [
[sg.Text("Hello")],
[sg.Button("はい"), sg.Button("終了"),],
]
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("ボタンの追加")],
[sg.Button("はい"), sg.Button("いいえ"),],
]
# ウィンドウ作成
window = sg.Window('ウィンドウのタイトル名', layout)
while True:
event, values = window.read()
print("event", event, flush=True)
window.close()
import PySimpleGUI as sg
layout = [
[sg.Text("ボタンの追加")],
[sg.Button("はい"), sg.Button("いいえ"),],
]
window = sg.Window('ウィンドウのタイトル名', layout)
while True:
event, values = window.read()
if event == "はい":
print("「はい」ボタン押下時の処理", flush=True)
if event == "いいえ":
print("「いいえ」ボタン押下時の処理", flush=True)
window.close()
No4 window.read の返却値を調べる
window.read()は基本的にループさせて使います(イベントループ)、その返却値によって処理を振り分けます。
どのような値が戻るかを確認しましょう!
ポイント
・eventにどのような値が設定されているかを確認
・ウィンドウのタイトルバーのクローズのアイコン
・ウィンドウ内の各ボタンのクリック
・ウィンドウがクローズされるとeventが sg.WIN_CLOSEDになる
下記がないとエラーが発生する
if event == sg.WIN_CLOSED:
break
ボタンによる処理の振り分け
# ------------------------------------
# No5
# ------------------------------------
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("Hello")],
[sg.Button("はい"), sg.Button("終了"),],
]
window = sg.Window('ウィンドウ名', layout)
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED:
print("クローズがクリック")
break
window.close()
No5 ウィンドウのタイトルバーの「X」で終了
ウィンドウのタイトルバーのクローズのアイコンで終了させてみましょう!
ポイント
・eventが、WINDOW_CLOSEDの場合に終了するようにする
# ------------------------------------
# No6
# ------------------------------------
import PySimpleGUI as sg
# ウィンドウのレイアウト
layout = [
[sg.Text("Hello")],
[sg.Button("はい"), sg.Button("終了"),],
]
# ウィンドウ作成
window = sg.Window('ウィンドウ名', layout)
while True:
event, values = window.read()
print("event", event, flush=True)
print("values", values, flush=True)
if event == "終了":
print("終了ボタンが押された")
break
window.close()
No6 終了ボタンクリックで終了
layoutの指定したボタンを押下させて終了させてみます。
ポイント
・layoutで作成したボタン名を確認
・eventがその名前の場合に、ループから抜けられるようにする
# ------------------------------------
# No7
# ------------------------------------
import PySimpleGUI as sg
layout = [
[sg.Text("年齢"), sg.Input(key="key1")],
[sg.Button("確定"), sg.Button("終了"),],
]
window = sg.Window("テストウィンドウ", layout )
while True:
event, values = window.read()
print("event", event, flush=True)
print("values", values, flush=True)
age = values['key1']
print( "年齢は", age, flush=True)
window.close()
# ------------------------------------
# No71
# ------------------------------------
import PySimpleGUI as sg
layout = [
[sg.Text("年齢"), sg.Input(key="key1")],
[sg.Button("確定"), sg.Button("終了"),],
[sg.Text("出力領域", key="key2") ],
]
window = sg.Window("テストウィンドウ", layout )
while True:
event, values = window.read()
print("event", event, flush=True)
print("values", values, flush=True)
age = values['key1']
print( "年齢は", age, flush=True)
window['key2'].update( age )
window.close()
# ------------------------------------
# No72
# ------------------------------------
import PySimpleGUI as sg
layout = [
[sg.Text("年齢"), sg.Input(key="key1")],
[sg.Button("確定"), sg.Button("終了"),],
]
window = sg.Window("テストウィンドウ", layout )
while True:
event, values = window.read()
print("event", event, flush=True)
print("values", values, flush=True)
if event == sg.WINDOW_CLOSED or event == '終了':
print("終了ボタンが押された")
break
elif event == "確定":
age = values['key1']
print( "年齢は", age, flush=True)
break
window.close()
No7 入力内容を取得
表示されているウィンドウから入力されたものを取得します
ポイント
・inputの引数に、keyを指定する
・window.read()で取得された valuesに先程のキーを指定して取得する
sg.Input(key="key1")
age = values['key1']
・ウィンドウに文字列を出力するには、updateメソッドを使います
window['key2'].update('年齢は、' + age )
ウィンドウに文字列を出力
参考URL
人間のためのPythonのGUI
update 2024