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