PySimpleGUI 備忘

投稿者: | 2023-01-28

目次

ポップアップ

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' 効かない
         )
sg.popup()
# 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)
sg.popup_get_text()
sg.popup()

フォントの設定パターン

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 に組み込む
カテゴリー: GUI