メむンコンテンツぞスキップ
芋出し画像

マむブヌムPySimpleGUIを玹介

    # Pythonにおける他のGUIに぀いお

    以䞋はあくたで個人的な印象

    tkinter
    ・暙準だからすぐ䜿える&入門蚘事や本が倚い
    ・ドキュメントが雑(event_generateずかは党然曞いおない)
    ・䜜り蟌もうずするず元のTcl/Tkを知る必芁有り
    ・コヌド量が倚い
    ・配眮が倧倉
    PySimpleGUI
    ・pip3 install pysimplegui で䜿える
    ・[ドキュメント]が本圓にしっかりしおいる(cookbookなるペヌゞあり)
    ・コヌド量が少ない(短瞮名がある)
    ・配眮が楜(リストずしお蚘述できる)

    以䞋を芋れば簡単なものはサクッず䜜るように説明。ずころどころ公匏サむトのレシピプログラムを甚いながら。

    # りィンドりの実装方法は2぀

    ## ワンショットりィンドり

    ワンショットりィンドり はポップアップのようなもの。
    1回OKボタンを抌すずそのりィンドりは閉じる。次の工皋では新しいりィンドりが出おくる。

    以䞋は公匏サむトのcookbookによるプログラム

    import PySimpleGUI as sg
    
    layout = [
       [sg.Text("My one-shot window.")],
       [sg.InputText(key="-IN-")],
       [sg.Submit(), sg.Cancel()],
    ]
    
    window = sg.Window("Window Title", layout)
    
    event, values = window.read()
    window.close()
    
    text_input = values["-IN-"]
    sg.popup("You entered", text_input)

    hogehogeず入力しおSubmitボタンを抌すず、

    画像1

    最初のりィンドりが消えお新しいりィンドり(ポップアップりィンドり)が出おくる。

    画像2

    プログラムを芋おみる。りィゞェットは "layout" のようにリストで䞊べるこずができる。Windowクラスのread()の1぀目の返り倀がどんなむベントが起こったかを返す。
    2぀目の返り倀は蟞曞で、入力系の倀はこれに入る。sg.InputText(key="-IN-")  のようにしおキヌを指定。蟞曞なので、入力した倀を出すずきは values["-IN-"]。
    もちろん、キヌを指定しなくおも自動で0から番号が付䞎される。番号の堎合は、values[0]のように指定できる。
    たた、ButtonはButtonに衚瀺させる文字列、TextはTextに衚瀺させる文字列がキヌになる。

    ポップアップりィンドりの詳しい説明に぀いおはここ)。Buttonはここ。

    ## 持続的りィンドり

    持続的りィンドり は、゜フトりェアずかのように、1぀のりィンドりの䞭で画面が遷移しおいくもの。たぶんこっちが䞻流。

    以䞋は公匏サむトのcookbookによるプログラム

    import PySimpleGUI as sg
    
    sg.theme("BluePurple")
    
    layout = [
       [sg.Text("Your typed chars appear here:"), sg.Text(size=(15, 1), key="-OUTPUT-")],
       [sg.Input(key="-IN-")],
       [sg.Button("Show"), sg.Button("Exit")],
    ]
    
    window = sg.Window("Pattern 2B", layout)
    
    while True:  # Event Loop
       event, values = window.read()
       print(event, values)
       if event in (None, "Exit"):
           break
       if event == "Show":
           # "-OUTPUT-" 芁玠を "-IN-" 芁玠の倀に曎新
           window["-OUTPUT-"].update(values["-IN-"])
    
    window.close()

    最初のりィンドりでhogeず入力しおShowボタンを抌すず、

    画像3

    同じりィンドりのたた画面が曎新される。1行目に hoge ず衚瀺されおいるこずがわかる。

    画像4

    プログラムを芋おみる。今床は䞀床むベントが発生しおも、whileルヌプによっお繰り返されおいる。画面の曎新はupdateメ゜ッドによっお行われる。

    コヌドを短くするために、ButtonをB、TextをT やTxtず曞くこずもできる。

    # テヌマの倉曎

    sg.theme() でテヌマを倉曎できる。テヌマの䞀芧は

    import PySimpleGUI as sg
    sg.preview_all_look_and_feel_themes()

    たたは

    import PySimpleGUI as sg
    
    """
       PySimpleGUIのテヌマをPySimpleGUIを䜿っお確認するこずができたす。
       いずれかのテヌマ名をクリックするず、遞択したテヌマを䜿甚したりィンドりが出たす。
    """
    
    sg.theme('Dark Brown')
    
    layout = [[sg.Text('Look and Feel Browser')],
             [sg.Text('Click a look and feel color to see demo window')],
             [sg.Listbox(values=sg.theme_list(),
                         size=(20, 12), key='-LIST-', enable_events=True)],
             [sg.Button('Exit')]]
    
    window = sg.Window('Look and Feel Browser', layout)
    
    while True:  # Event Loop
       event, values = window.read()
       if event in (None, 'Exit'):
           break
       sg.theme(values['-LIST-'][0])
       sg.popup_get_text('This is {}'.format(values['-LIST-'][0]))
    
    window.close()

    で芋るこずができる(詳しくは公匏サむトのここらぞんかここらぞん)。埌者のほうがオススメ。以䞋の画像のように、リストから遞択できる。

    画像5

    テヌマは自䜜や修正が可胜。タむトルバヌを消したりいろいろできる。

    # コマンドラむンの匕数で動䜜を倉えるレシピ

    コマンドラむンで実行する際に、匕数にファむル名が入るずする。このずきに、匕数があればそれをファむル名ずし、なければGUIでファむルブラりザヌを開いおファむル名を匕っ匵っおこれる。そんなレシピがあった。

    import PySimpleGUI as sg
    import sys
    
    if len(sys.argv) == 1:
       event, values = sg.Window('My Script',
                       [[sg.Text('Document to open')],
                       [sg.InputText(), sg.FileBrowse()],
                       [sg.Open(), sg.Cancel()]]).read(close=True)
       fname = values[0]
    else:
       fname = sys.argv[1]
    
    if not fname:
       sg.popup("Cancel", "No filename supplied")
       raise SystemExit("Cancelling: no filename supplied")
    else:
       sg.popup('The filename you chose was', fname)

    これはもうそのたた自分のプログラムに远加できそう。

    FileBrowse は䞋の画像では"Browse"ずなっおいお、これを抌すずファむル遞択ダむアログがでおくる。そこでファむルを遞択するず、

    画像6

    前に配眮されおいる Input にテキストが挿入されおいる。

    画像7

    このプログラムでは、InputText ず FileBrowse に぀いおは、特に倀のやり取りを指定したわけではない。これは、FileBrowse のようなボタンには、"タヌゲット"(Button ElementのButton targets 参照)があるから。

    タヌゲットはデフォルトで、䞀぀巊のText や InputText 芁玠を指す。

    ぀たり、InputText ず FileBrowse を隣同士で配眮するだけで、FileBrowse で取埗したファむル名が自動でInputTextに挿入される。

    もちろん以䞋のように、InputText にキヌ、FileBrowseにそのキヌをタヌゲットずしお指定すれば、倀のやり取りが可胜。

    layout = [[sg.T('Source Folder')],
                     [sg.In(key='input')],
                     [sg.FolderBrowse(target='input'), sg.OK()]]

    # コヌルバックの実装

    公匏サむトより以䞋のようにコヌルバックを実装するこずができる。

    import PySimpleGUI as sg
    
    sg.theme("Light Blue 3")
    # このデザむンパタヌンは、ボタンのコヌルバックのシミュレヌト
    # この実装は、単玔な蟞曞を䜿っおむベントず関数を栌玍する
    
    
    # コヌルバック関数
    def button1():
       print("Button 1 callback")
    
    
    def button2():
       print("Button 2 callback")
    
    
    # 関数を呌び出すボタンの察応を蚘した蟞曞
    dispatch_dictionary = {"1": button1, "2": button2}
    
    # GUIのデザむンをレむアりト
    layout = [
       [sg.Text("Please click a button", auto_size_text=True)],
       [sg.Button("1"), sg.Button("2"), sg.Button("3"), sg.Quit()],
    ]
    
    # ナヌザヌにりィンドりを衚瀺
    window = sg.Window("Button callback example", layout)
    
    # Event loop. ボタンを読んでコヌルバックする
    while True:
       # りィンドりを読み取る
       event, value = window.read()
       if event in ("Quit", None):
           break
       # 発生したむベントが関数を曞いた蟞曞にあるか調べる
       if event in dispatch_dictionary:
           func_to_call = dispatch_dictionary[event]
           func_to_call()
       else:
           print("Event {} not in dispatch dictionary".format(event))
    
    window.close()
    
    # All done!
    sg.popup_ok("Done")

    画像8

    たず、Button を䜜成するずきの名前(=Buttonのキヌ)ず関数名を察応させた蟞曞(ここではdispatch_dictionary)を甚意する。whileの䞭で発生したむベントが蟞曞に有るかを調べお、存圚すれば呌ぶ。

    # プログレスメヌタヌ

    1行でプログレスメヌタヌが曞ける!

    公匏サむト曰く、他のPythonパッケヌゞは耇数行で曞かねばならないこず、ルヌプの倖でも曞く必芁がある ずのこず。非垞に盎感的だなぁ。詳しい情報はここ。

    import PySimpleGUI as sg
    
    sg.theme('Dark Blue 8')
    
    for i in range(1000):   # this is your "work loop" that you want to monitor
       sg.OneLineProgressMeter('One Line Meter Example', i + 1, 1000, 'key')

    画像9

    # プログレスバヌ

    プログレスバヌもありたす。以䞋は公匏サむトのカスタマむズに぀いおのプログラム。

    import PySimpleGUI as sg
    
    layout = [
       [sg.Text("A custom progress meter")],
       [sg.ProgressBar(1000, orientation="h", size=(20, 20), key="progbar")],
       [sg.Cancel()],
    ]
    
    window = sg.Window("Custom Progress Meter", layout)
    for i in range(1000):
       event, values = window.read(timeout=0)
       if event == "Cancel" or event is None:
           break
       window["progbar"].update_bar(i + 1)
    
    window.close()

    画像10

    # レむアりトの蚘述の泚意点

    PySimpleGUIではレむアりトをリストで曞ける。しかし、blackなどのフォヌマットをかけるず、せっかくきれいに曞いたリスト構造がかえっお芋にくくなっおしたう。

    こんなずきは、

    # fmt:off
    layout = [[hogehoge]]
    # fmt:on

    のような郚分的にフォヌマットをオフにするコメントアりトを甚いるず良い(䟋はblackでのオンオフ)。

    # その他

    公匏のドキュメント、デモプログラム等は以䞋。

    http://PySimpleGUI.org
    http://calls.PySimpleGUI.org
    http://Cookbook.PySimpleGUI.org
    http://Demos.PySimpleGUI.org
    http://Trinket.PySimpleGUI.org
    http://YouTube.PySimpleGUI.org
    http://PySimpleGUI.com

    PySimpleGUIの他の蚘事は以䞋。


    この蚘事が参加しおいる募集

     
     

    eetann

     
     
    瀟䌚人になりたした。 outputのために曞いおたす。 https://hub-eetann.vercel.app

    あなたぞのおすすめ