pip install pysimplegui
import PySimpleGUI as sg
# 画面レイアウト
layout = [
[sg.Text('おはよう')],
[sg.Button('終了')]
]
# ウィンドウ表示
window = sg.Window('サンプル', layout)
# イベントループ
while True:
event, values = window.read()
# ×ボタン、もしくは、終了ボタンを押したとき
if event in (None, '終了'):
break
# 終了
window.close()
画面レイアウトはリストのリスト。内部のリストが1行を表す。
その中にTextやButtonなどの部品を書く。
Window(タイトル,レイアウト)でウィンドウを表示する。
イベントループ内では、ユーザの行動をイベントという形で得る。これはreadで発生したイベント(event)と入力値(values)を取得する。
イベントは発生させた部品のテキスト、もしくはkeyが入る。×ボタンを押すとイベントはNoneになるので、breakでイベントループを終了させている。
import PySimpleGUI as sg
# 画面レイアウト
layout = [
[sg.Text('数を入力')],
[sg.InputText(key='-NUM-') ],
[sg.Button('2倍'), sg.Button('終了')]
]
# ウィンドウ表示(タイトル、レイアウト)
window = sg.Window('2倍の計算', layout)
# イベントループ
while True:
event, values = window.read()
# ×ボタン、もしくは、終了ボタンを押したとき
if event in (None, '終了'):
break
# 2倍ボタンを押したとき
if event == '2倍':
num = int(values['-NUM-'])
sg.popup(str(num*2))
# 終了
window.close()
InputTextはテキスト入力を行う部品。valuesに入力された値が入る。
valuesは部品の値(主に入力値)。辞書になっており、入力部品のkeyがキーになる。keyを設定しなかった部品は 0 から順にキーが設定される。
popupメソッドでポップアップダイアログが表示される。
最初の引数はタイトル(title)、2番目がレイアウト(layout)
| 名前 | 説明 | 指定の例 |
|---|---|---|
| disable_minimize | 最小化ボタンの有無。Trueで無し | disable_minimize=True |
| disable_close | 閉じるボタンの有無。Trueで無し | disable_close=True |
| size | サイズ(ピクセル) | size=(400,200) |
| font | フォント | font='Fixedsys' |
| pad | マージン(左右,上下) | pad=((20,20),(10,5)) |
| background_color | 背景色。#rrggbb | background_color='#ff0000' |
| Text | 文字列 |
| InputText | テキスト入力 |
| Button | ボタン |
| Checkbox | チェックボックス |
| Radio | ラジオボタン |
| Listbox | リストボックス |
| MultiLine | 複数行 |
| Image | 画像 |
| 名前 | 説明 | 指定の例 |
|---|---|---|
| key | キー。valuesのキーやイベントの名前になる。 | key='-TEXT-' |
| size | サイズ(横文字数、縦文字数) | size=(4,2) |
| enable_events | ボタン以外で選択等でイベントを発生させる | enable_events=True |
| pad | マージン(左右,上下) | pad=((20,20),(10,5)) |
| font | フォント(フォント名、サイズ) | font=('MS ゴシック',18) |
| text_color | 文字色。色名(redなど)や#rrggbb | text_color='#ff0000' |
| button_color | ボタンの場合。(文字色,背景色)で指定。1つだけだと背景色。 | button_color=('red','white') |
| background_color | 背景色。色名(redなど)や#rrggbb | background_color='#ffff00' |
| border_width | 枠の太さ | border_width=1 |
| relief | 枠のスタイル | relief=sg.RELIEF_SOLID |
window[キー名].メソッド名() で使うことが出来る。
| 名前 | 説明 | 指定の例 |
|---|---|---|
| update | テキストを更新する。 | window['-TEXT-'].update(mes) |
| get_text | テキストを取得する。 | txt = window['-TEXT-'].get_text() |
| set_focus | カーソル移動。 | window['-TEXT-'].set_focus(True) |
初期値をリストで指定し、表示する
valuesはリストになるので注意。初期設定では1つしか選択できないが select_mode=sg.LISTBOX_SELECT_MODE_MULTIPLEで複数選択可能になるため。
import PySimpleGUI as sg
kens = ['福岡','大分','佐賀','長崎','熊本','宮崎','鹿児島']
layout = [
[sg.Text('九州')],
[sg.Listbox(kens,size=(10,8),key='-LIST-')],
[sg.Button('表示'),sg.Button('終了')]
]
window = sg.Window('サンプル', layout)
while True:
event, values = window.read()
if event in (None, '終了'):
break
if event == '表示':
ken = values['-LIST-'][0]
sg.popup(ken)
window.close()
enebale_eventsをTrueにすると選択時にイベントがキー名で発生するようになる。
import PySimpleGUI as sg
kens = ['福岡','大分','佐賀','長崎','熊本','宮崎','鹿児島']
layout = [
[sg.Text('九州')],
[sg.Listbox(kens,size=(10,8),key='-LIST-',enable_events=True)],
[sg.Text('',size=(6,1),key='-KEN-')],
[sg.Button('表示'),sg.Button('終了')]
]
window = sg.Window('サンプル', layout)
while True:
event, values = window.read()
if event in (None, '終了'):
break
if event == '表示':
ken = values['-LIST-'][0]
sg.popup(ken)
if event == '-LIST-':
ken = values['-LIST-'][0]
window['-KEN-'].update(ken)
window.close()
values[キー]にTrueかFalseが入る。enable_events=Trueにすると変更時にイベントが通知される。
import PySimpleGUI as sg
layout = [
[sg.Text('チェック無し',key='-TEXT-')],
[sg.Checkbox('チェック',key='-CHK-',enable_events=True)],
[sg.Button('終了')]
]
window = sg.Window('サンプル', layout)
while True:
event, values = window.read()
if event in (None, '終了'):
break
if event =='-CHK-':
if values['-CHK-']:
window['-TEXT-'].Update('チェック有り')
else:
window['-TEXT-'].Update('チェック無し')
window.close()
ラジオボタンは生成時にテキストの後にgroup_idを入れる。これは書くラジオボタンが同一のグループであることを認識させ、そのグループ内で1つのボタンしか選択できないようにする。
import PySimpleGUI as sg
layout = [
[sg.Text('性別',key='-GEN-')],
[sg.Radio('男',1,key='-MALE-',enable_events=True)],
[sg.Radio('女',1,key='-FEMALE-',enable_events=True)],
[sg.Button('終了')]
]
window = sg.Window('サンプル', layout)
while True:
event, values = window.read()
if event in (None, '終了'):
break
if event == '-MALE-':
window['-GEN-'].Update('男')
if event == '-FEMALE-':
window['-GEN-'].Update('女')
window.close()
Imageはfilename引数にファイル名を指定する。png、gifファイルを読み込ませ表示可能。
layout = [
[sg.Text('画像')],
[sg.Image(filename='cat.png')],
[sg.Button('終了')]
]
画像を更新するには、updateメソッドでfilenameを指定する
if event == '表示':
window['-IMG-'].update(filename='cat2.png')
他の形式の画像はOpenCVで読み込み、変換してdataに設定して表示。
import cv2
img = cv2.imread('cat.jpg')
imdata = cv2.imencode('.png',img)[1].tobytes()
layout = [
[sg.Text('画像')],
[sg.Image(data=imdata)],
[sg.Button('終了')]
]
FileBrowseはファイルを指定するボタン。初期設定で、同じ行の1つ前のテキストボックスに指定したファイル名を設定する。
import PySimpleGUI as sg
layout = [
[ sg.InputText('', key='-FNAME-'),sg.FileBrowse('読込', file_types=(('png', '*.png'),) )],
[ sg.Button('表示') ],
[ sg.Image(size=(640,480),key='-IMG-')],
]
window = sg.Window('画像表示', layout)
while True:
event, values = window.read()
print(event)
if event in (None, '終了'):
break
if event == '表示':
fname = values['-FNAME-']
window['-IMG-'].update(filename=fname)
window.close()
MenuBarはウィンドウ上部にメニューを追加する。初期設定でリストのリストを設定し、
メニュー名,[メニュー名のリスト]
を設定する
layout = [
[
sg.MenuBar([
['ファイル',['開く','閉じる','終了']],
['編集',['コピー','貼り付け']]
])
],
[sg.Multiline('',size=(40,10))],
]
イベントはメニューのテキストで発生する。
window.popup(テキスト,title="タイトル")
sg.popup("ボタンのテストです")
sg.popup("ボタンのテストです",title="テスト")
OK、Cancelのボタンが出る。戻り値は押したボタンのテキスト。同様のpopup_yes_no もある。
res = sg.popup_ok_cancel("ボタンのテストです",title="テスト")
ファイル選択を行う。save_as=Trueとすると保存用のファイル選択になる。
file_types=(("Text Files", ".txt")のようにしてファイルの種類も指定可能。
fname = sg.popup_get_file("ファイルの選択")
fname = sg.popup_get_file("ファイルの選択")
windows.readにtimeoutをミリ秒単位で指定すると、一定時間間隔でtimeout_keyで指定したイベントが発生する。
event, values = window.read(timeout=100,timeout_key='-timeout-')