PySimpleGUI
前回、PySimpleGUIでラジオボタンの設定(グループ、文字の色、背景色、フォントサイズ)と状態を取得する方法を紹介しました。
今回はリストボックスの設定(文字の色、背景色、フォントサイズ、複数選択)と選択した項目を取得する方法を紹介します。
では始めていきましょう。
リストボックスの設置
リストボックスを設置するには、項目を格納したリストを準備し、「sg.Listbox(項目のリスト, key=’キー’)」をlayoutに格納します。
import PySimpleGUI as sg
listitems = ['abc', 'def', 'hij']
layout = [[sg.Listbox(listitems, key='-list1-')]]
window = sg.Window('Title', layout, size=(200,100))
event, values = window.read()
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
window.close()
ただこのままではリストのうち一つだけが見えている状態になっており、他の項目が見えません。
そんな時は「size=(幅、高さ)」でリストボックスのサイズを変更します。
この際、高さを「len(リスト)」にすることで全部の要素を表示することができます。
import PySimpleGUI as sg
listitems = ['abc', 'def', 'hij']
layout = [[sg.Listbox(listitems, key='-list1-', size=(10,len(listitems)))]]
window = sg.Window('Title', layout, size=(200,100))
event, values = window.read()
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
window.close()
文字の色や背景色、フォント、フォントサイズの設定
文字の色を変えるには「text_color=’文字の色’」を、背景色を変えるには「background_color=’背景色’」をオプションに追加します。
またフォント、フォントサイズを変更するには「font=(‘フォント’, フォントサイズ)」をオプションに追加します。
import PySimpleGUI as sg
listitems = ['abc', 'def', 'hij']
layout = [[sg.Listbox(listitems, key='-list1-', text_color='Red', background_color='Yellow', font=('Arial',20))]]
window = sg.Window('Title', layout, size=(200,100))
event, values = window.read()
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
window.close()
ボタンを押したらリストボックスの選択されている項目を取得
次にリストボックスの選択した項目を取得する方法を解説していきます。
実際に使う場面を考えると、ボタンを押したら入力値を取得し、何らかの処理をするという可能性とリアルタイムに値を取得し、処理をする可能性が考えられます。
ということで両方解説していきますが、まずは「ボタンを押したら選択した項目を取得」してみましょう。
while文中で「event, values = window.read()」として値を取得している場合、選択した項目は「values[‘キー’][インデックス]」で取得できます。
選択項目が一つだけの場合、インデックスは「0」固定で大丈夫です。
import PySimpleGUI as sg
listitems = ['abc', 'def', 'hij']
layout = [[sg.Listbox(listitems, key='-list1-', size=(10,len(listitems)))],
[sg.Text('Text', key='-text1-')],
[sg.Button('Button', key='-button1-')]]
window = sg.Window('Title', layout, size=(200,100))
event, values = window.read()
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
elif event == '-button1-':
window['-text1-'].update(values['-list1-'][0])
window.close()
「def」を選択し、「Button」をクリックすると、テキストの場所に「def」と表示されました。
ちなみにインデックスを無くして、「values[‘キー’]」とした場合はリストの状態で表示されます。
import PySimpleGUI as sg
listitems = ['abc', 'def', 'hij']
layout = [[sg.Listbox(listitems, key='-list1-', size=(10,len(listitems)))],
[sg.Text('Text', key='-text1-')],
[sg.Button('Button', key='-button1-')]]
window = sg.Window('Title', layout, size=(200,100))
event, values = window.read()
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
elif event == '-button1-':
window['-text1-'].update(values['-list1-'])
window.close()
なぜリストで値が取得されるのか、その答えは次にあります。
値を一度に複数取得する方法
リストボックスの選択項目は基本的には1つですが、オプションをつけることで複数個同時に取得することも可能です。
その場合は「select_mode=sg.LISTBOX_SELECT_MODE_MULTIPLE」を追加します。
import PySimpleGUI as sg
listitems = ['abc', 'def', 'hij']
layout = [[sg.Listbox(listitems, key='-list1-', size=(10,len(listitems)), select_mode=sg.LISTBOX_SELECT_MODE_MULTIPLE)],
[sg.Text('Text', key='-text1-')],
[sg.Button('Button', key='-button1-')]]
window = sg.Window('Title', layout, size=(200,100))
event, values = window.read()
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
elif event == '-button1-':
window['-text1-'].update(values['-list1-'])
window.close()
この例ではボタンを押した時の動作として「values[‘-list1-‘]」を「-text1-」に表示するようにしています。
この場合、「abc」、「hij」を選択してボタンを押すとこのようになります。
このように複数個選択した場合は、選択した複数の項目が格納されたリストとして返されるのです。
ということでリストボックスを使う際には、リストが返ってくることに注意しましょう。
今回の例で複数個の値を文字列として取得したい場合はfor文を使って一つ一つ取り出して、使用するのが楽かもしれません。
import PySimpleGUI as sg
listitems = ['abc', 'def', 'hij']
layout = [[sg.Listbox(listitems, key='-list1-', size=(10,len(listitems)), select_mode=sg.LISTBOX_SELECT_MODE_MULTIPLE)],
[sg.Text('Text', key='-text1-')],
[sg.Button('Button', key='-button1-')]]
window = sg.Window('Title', layout, size=(200,100))
event, values = window.read()
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
elif event == '-button1-':
output_str = ''
for val in values['-list1-']:
output_str = output_str + val + ' '
window['-text1-'].update(output_str)
window.close()
リアルタイムに値を取得
リアルタイムに値を取得する場合、「sg.Listbox()」のオプションに「enable_events=True」を追加します。
import PySimpleGUI as sg
listitems = ['abc', 'def', 'hij']
layout = [[sg.Listbox(listitems, key='-list1-', size=(10,len(listitems)), enable_events=True)],
[sg.Text('Text', key='-text1-')]]
window = sg.Window('Title', layout, size=(200,100))
event, values = window.read()
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
window['-text1-'].update(values['-list1-'][0])
window.close()
これでリストボックスで選択されている項目が変わるとリアルタイムに表示が変わります。
次回はチェックボックスを紹介します。
ではでは今回はこんな感じで。
コメント