PySimpleGUIで動的にチェックボックスを作成して選択した値を取得してみた

はじめに

結局あまり更新できてない今日この頃です。

何かしら触っておきたいなと思って久々にPySimpleGUIを触ってみました。

今回気になったのはCheckboxとかRadiobutton系を動的に作成したいと思ったらどうするんだろう?というところ。

何かしらアプリ作成する場合はよくあるシチュエーションな気がしたので、今回もとりあえず動くものだけは作ってみました。

汚いコードですので、こんなのもあんだなというぐらいでみてください。

実際のコード

兎にも角にも動いたコード貼っておきます。

# -*- coding: utf-8 -*-

import PySimpleGUI as sg

sg.theme('Dark Blue 3')

check_dic = {
    '1': 'aaa',
    '2': 'bbb',
    '3': 'ccc',
}

layout = [
    [sg.Text('読み込むテキストファイルを選択してください', size=(45, 1))],
    [sg.Checkbox(item[1], key=item[0]) for item in check_dic.items()],
    [sg.Button('popup', key='-POPUP-')],
]

# ウィンドウ生成
window = sg.Window('動的にコントロールを配置する', layout)
index = 0

while True:
    event, values = window.read()

    if event is None:
        break

    if event == '-POPUP-':
        disp_text = ''

        #valuesの中身(aaaだけ選択された場合)
        #{'1': True, '2': False, '3': False}
        for value in values.items():

            # True(選択されている)の場合は文字列を表示するため、ちょっとだけ加工
            if value[1]:
                if not disp_text == '':
                    disp_text += ', '
                disp_text += check_dic[value[0]]

        # 選択されているかどうかで表示メッセージを変更
        if disp_text == '':
            sg.popup_ok('何も選ばれていません。')
        else:
            sg.popup_ok(disp_text + 'が選ばれています。')

db.close()

# ウィンドウ破棄
window.close()

今回はcheck_dicという辞書型の変数に表示したいテキストをValue, 処理上紐付けたい値をKeyに設定しました。

とりあえずで辞書型で動かしてみましたが、これがタプルを抱えたリストとかでも値の取り方次第ではうまく動くのではないかと思われます。

今回動的にコントロール作成している箇所は以下のコードです。

    [sg.Checkbox(item[1], key=item[0]) for item in check_dic.items()],

item[1]で表示用のテキスト、item[0]で処理するためのキーを引っ張ってきてます。

選択されたかどうかを項目として抽出するために今回はpopupに表示するやり方で確認してみました。

popupにしたのは気まぐれです。表示できればなんでもいいです。

popupを表示するためのボタンを押下したときに選択されたかどうかをみているのは下のコードです。

        #valuesの中身(aaaだけ選択された場合)
        #{'1': True, '2': False, '3': False}
        for value in values.items():

            # True(選択されている)の場合は文字列を表示するため、ちょっとだけ加工
            if value[1]:
                if not disp_text == '':
                    disp_text += ', '
                disp_text += check_dic[value[0]]

コメントにも書いてありますが、例えば'aaa'が選択されている場合はvaluesの中の '1' というキーがTrueで設定されています。

そこで今回は単純にfor文でvaluesの中身回してTrueだったキーだけ引っ張ってきてます。

そのあとはTrueだったキーを引数にcheck_dicからvalueを引っ張り出してるだけです。

コードはいけてないですが要領としてはこんな感じで持ってくることはできそう。

なんかもう少しいい書き方ないかとかメソッド用意されてないかは勉強中です。

最後に

思い至ってなんとなく書いてとりあえず動いたので記事にしてみました。

チェックボックスとか決められた個数にはならずDBなりExcelなりで決められていない個数の値を

チェックボックスとして表示して設定させたいという機会はありそうだなーと思い、書いてみました。

まあ、実際自分がそういう処理を使いそうだから試してみただけなんですけどね。

何か進展あれば書きます。これ書いてる時は大体続きはないですが。

それでは今日はこの辺で。

それではー

コメント

タイトルとURLをコピーしました