目次
ポップアップ
- https://www.pysimplegui.org/en/latest/#popup-output
- ×で閉じると戻り値は「None または WIN_CLOSED」
- なぜか効かないパラメータがある(title,no_titlebarなどがだめだった)
sg.popup('popup') # 戻り値:OK
sg.popup_ok('popup_ok') # OK
sg.popup_yes_no('popup_yes_no') # Yes and No
sg.popup_cancel('popup_cancel') # Cancelled
sg.popup_ok_cancel('popup_ok_cancel') # OK and Cancel
sg.popup_error('popup_error') # Error
sg.popup_timed('popup_timed') # auto_close_duration=s、で秒数を指定可
sg.popup_auto_close('popup_auto_close') # Same as PopupTimed# ポップアップ(カスタマイズ)※popup_okなどにも勿論使える
sg.popup('本文テキストを最初に書く。titleは後ろへ。',
'カンマ区切りで2行目に入力されます',
title="タイトルは本文短いと見えない",
font='Meiryo 18',
keep_on_top=True,
location=(100, 100),
# button_justification='left' 効かない
)
# 1行だけのテキスト入力を受け取る(改行したい場合は\n記号が必要)
text = sg.popup_get_text("1行しか表示できません。\n改行した場合は\\nを利用。\ndefault_text で最初から文字表示も可\nsize指定はテキスト枠の文字数が10になる",
default_text='1234567890',
size=(10,50),
font='Meiryo 12',
button_color=('red', 'yellow'), # (テキスト、背景)
keep_on_top=True,
location=(100,900))
# 上記の引数を受けて、popupしたい場合
sg.popup('入力結果:', '上で入力したtextは以下です', text)

フォントの設定パターン
font1 = 'Courier 18'
font2 = 'Courier 18 underline italic'
font3 = ('Courier', 18)
font4 = ('Courier', 18, 'underline italic bold overstrike)
font5 = (None,18)パディング
- 上下左右の余白を調整(ピクセル単位)、2つの表記方法。
pad=(左右, 上下)
sg.Text("Padding", pad=(50, 100))
pad=(0,0)だと上下がきっちり詰まる
pad=((左, 右), (上, 下))
pad=((50, 60), (10, 30))全要素で使用できるメソッドは12個
e.g. window[-ANYTHING-].~
bind
expand
get_size
hide_row
set_cusor
set_focus
set_size
set_tooltip
set_vscroll_position
unbind
unhide_row
update
日付ポップアップ
sg.popup_get_date()
デバッグ出力
import PySimpleGUI as sg
sg.Print(1,2,3, text_color='white', background_color='red', font='courier 16', end='')
def main():
layout = [[sg.Text('My Window')],
[sg.Input(key='-IN-')],
[sg.Text(size=(30, 1), key='-OUT-')],
[sg.Button('Go'), sg.Button('Exit')]]
window = sg.Window('Window Title', layout)
while True: # Event Loop
event, values = window.read()
print(event, values)
if event == sg.WIN_CLOSED or event == 'Exit':
break
sg.PrintClose()
window['-OUT-'].update(f'You clicked {event}')
window.close()
画面のリサイズ
- ドラッグして画面を拡大縮小できるか
sg.Window(" ", resizable=True)
画面のリサイズが可能。デフォルトはFalse
eventとvaluesの備忘
event, values = window.read()
- print(event, values)とすれば、例えばボタンを押せば(eventなら)なんでもすべてのevent,values=dic{key: val}がコンソールに出力される
- eventのトリガーはほとんどがボタンのクリック。KEYを設定すると戻り値はKEY、KEYがない場合はボタンの名前が戻る
- とりあえずどんなEventであっても、何かEventを起こせば、そのwindowsの”すべて”の event, values が戻ってくる(dic形式)。値なら values[‘-KEY-‘] で取り出す(valuesがあるものは)
悩む 値の取得
- sg.T(f”{year}”, key=’-YEAR-‘)で、values[‘-YEAR-‘]でそのときの値テキスト(YEAR)を取ろうとしたところ
KeyErrorになってしまっていた。この方法で悩む。 - 現時点でわかったことはvaluesは主にinput エレメントを使った時に取得できるもの
- そのため、このT自体の情報を取るには window[‘-YEAR-‘]としないといけない
- よって window[‘-KEY-‘].メソッド、となる。
- つまり、使えるメソッドはそのKEYを設定しているElementによって異なる。
- 上記で window[‘-YEAR-‘].get_text()でエラーになったのは、そのキーのElementが メソッド get_text をもっていないから。
- また sg.Text の場合、そのテキストを取得したいならば get_text() ではなく .get() が正解。
- Elementにより同じ機能であってもメソッド名が違うこともある
自作関数をimportする場合
- その自作関数名はmain()としないほうがいいと思う。たぶんimport側の main() とだぶるため実行できないことがあった。ただしその時だけだったかも。
import test <- .put
test.func() ← 関数func を利用
コンソールにログを表示させるには
event, values = window.read()
print(event, values)
>> {'KEY': value}がすべて表示される
popupでリスト
import PySimpleGUI as sg
def popup_drop_down(title, text, values):
event, values = sg.Window(title,
[[sg.Text(text)],
[sg.Combo(values, key='-DROP-', size=(40,1))],
[sg.OK(), sg.Cancel()]
], ).read(close=True) return None if event != ‘OK’ else values[‘-DROP-‘] m_list = [f'{str(i)}月’ for i in range(1, 13)] value = popup_drop_down(‘Title’, ‘Choose something’, m_list)
set_options, Print()
- set_option で全体の設定を決めておく
sg.set_options(font='Default 14') # set system-wide default
sg.Print('Output from popup_get_date', font='Default 16', keep_on_top=True, size=(30,10), location=(1700,350))
Radio Button(変数の扱い方、全部をOFFに等)
#========2 - Simulated Radio Button EXAMPLE =================
def main_checkbox_simulating_radios():
color_names = ['red', 'green', 'blue', 'yellow']
layout = [ [sg.Text('Simulated Radio Buttons')],
[sg.MLine(size=(60,10),write_only=True, reroute_stdout=True, reroute_cprint=True, k='-ML-')],
# この表現 [sg.Checkbox(name, k=name, enable_events=True, checkbox_color='black') for name in color_names],
[sg.Button('Go'), sg.Button('Exit')] ]
window = sg.Window('Checkbox', layout, keep_on_top=True)
while True: # Event Loop
event, values = window.read()
print(event, values)
if event == sg.WIN_CLOSED or event == 'Exit':
break
# この表現
if event in color_names:
for k in color_names:
window[k].update(False, checkbox_color='black')
window[event].update(True, checkbox_color='red')
window.close()
イベントを持たないElement
- Buttonのように押したらeventsが発生するものはwindow[‘-Key-‘]等で拾えるが
- RadioボタンやCheckboxはもともとeventsをもたない
- そのようなElementの場合、enable_events=True を付与すればよい
シンプルに書く
- ボタンそのものを関数にする
- それを layout に組み込む
