【Python】GUIアプリを作ってみよう③リストボックスを動かしてみよう

今回は前回から一歩進んでリストボックスの操作をしてみます。
要素の追加や移動を学びます。

■前提

OS:Windows10
プログラム言語:Python

■レイアウトの準備

今回はこのようなレイアウトを準備します。

作成方法がわからない場合はこちらを参考にしてください。

作成方法は把握している、とりあえず実行ファイルを用意したい方はこちらからクローンしてください。完成後のファイルも用意しています。

「app.py」を実行するとアプリが起動します。

それでは、今回の仕様はこのような形となります。

  1. 追加テキストボックスに文字を入れた状態で「ADD」を押すと左のリストボックスにスタックされる

  2. 左のリストボックスの要素を選択した状態で「▶▶」を押すと右のリストボックスに要素が移る

  3. 右のリストボックスの要素上でダブルクリックした場合、対象の要素を削除する

  4. 対象項目が空白である場合は処理を行わない

■実装

ADDボタン

左のリストボックスに文言を追加する処理を加えます。

def on_add(self, event):  # wxGlade: MyFrame.<event_handler>

    word = [self.text_ctrl_add.GetValue()] # ここポイント!
    if word[0] != "":  # 空白の時は追加しない
        listCount = self.list_box_left.Count # 左リストボックスの要素数
        self.list_box_left.InsertItems(word, listCount) # 取得した要素数の次に挿入
        self.text_ctrl_add.Clear() # 使用したテキストを初期化

ポイントはリストボックスへのデータ挿入です。リスト型の文字列を用いる必要があります。
今回は文字列1つだけを追加していますが、リスト型ということで複数同時に追加することもできそうです。

InsertItems(self, items, pos)
 Insert the given number of strings before the specified position.

 Parameters
 ・items (list of strings) – Labels of items to be inserted
 ・pos (int) – Position before which to insert the items: if pos is 0 the items will be inserted in the beginning of the listbox

https://docs.wxpython.org/wx.ListBox.html

▶▶ボタン

左のリストボックスから右のリストボックスへ要素を移動させます。

def on_move(self, event):  # wxGlade: MyFrame.<event_handler>

    selectValue = [self.list_box_left.StringSelection]  # 左リストボックスで選択した要素
    listCount_left = self.list_box_left.GetSelection()  # 左リストボックスで選択したインデックス
    listCount_right = self.list_box_right.Count         # 右リストボックスの要素数

    if listCount_left != -1: # 非選択時は処理しない  
        self.list_box_right.InsertItems(selectValue, listCount_right)
        self.list_box_left.Delete(listCount_left)

左の要素を右に追加したのちに削除しています。ボックス間を移動させるメソッドは用意されていません。

ダブルクリック

右リストボックスの要素をダブルクリックした際に要素を削除します。

def on_dclick(self, event):  # wxGlade: MyFrame.<event_handler>
    listCount_right = self.list_box_right.GetSelection()  # 右リストボックスで選択したインデックス
    self.list_box_right.Delete(listCount_right)

Deleteの引数にリストボックスで選択したインデックスを渡すことで要素を削除します。
公式リファレンスからDeleteの確認が取れませんでした。どのオブジェクトでも用意されていそうですのでどこかに記載があるのかもしれません。

ここまできたら簡単な業務アプリなら作れそうな気がしてきますね!

この記事が気に入ったらサポートをしてみませんか?