python_tkinter_listbox_クリアしてから_アイテムの表示の更新

 

items = ["Apple", "Banana", 


"Cherry", "Date", "Elderberry"]


pythonにおいて tkinterのlistboxを使って

上記のリストの文字列を一覧表示するさい、


リストのなかほどに要素の追加、削除などがあってから


再びリストの表示を更新したいとき、


いったん、listboxの表示を空白にしたほうがいいのでしょうか?


そして、for文などをつかって 

insertしていったほうがいいのでしょうか?


その際の python独自の簡潔な記述法、

というものがあるのでしょうか?


    


はい、`tkinter.Listbox` の表示を更新する際は、

いったんリストをクリアしてから、

新しいデータを `insert` するのが一般的です。


### **方法**

1. **リストの内容をクリア**

   - `listbox.delete(0, tk.END)` で全ての項目を削除

2. **リストの内容を更新**

   - `for` ループで `insert` する


### **Pythonらしい簡潔な書き方**

`for` ループを使う方法はもちろんOKですが、

リスト内包表記や `map()` を使って簡潔に書くこともできます。


---


### **コード例**

```python

import tkinter as tk


# 初期データ

items = ["Apple", "Banana", "Cherry", "Date", "Elderberry"]


def update_listbox(new_items):

    """Listboxを更新する関数"""

    listbox.delete(0, tk.END)  # クリア

    # 簡潔な記述:map() を使って insert

    list(map(listbox.insert, range(len(new_items)), new_items))


# Tkinter ウィンドウ設定

root = tk.Tk()

root.geometry("300x200")


listbox = tk.Listbox(root)

listbox.pack(fill=tk.BOTH, expand=True)


# 初回のリスト表示

update_listbox(items)


# データ変更後の再更新



items.insert(2, "Blueberry")  # 例: 3番目に追加


items.remove("Date")          # 例: "Date" を削除


update_listbox(items)


root.mainloop()



```


---


### **ポイント**


1. `listbox.delete(0, tk.END)` でリストをクリア


2. `list(map(listbox.insert, range(len(new_items)), new_items))` で

 `insert` を一括実行


   - `map()` は関数適用に使え、ループを省略できる



   - `listbox.insert(index, item)` を `map()` で適用



   - `range(len(new_items))` を使い、インデックスを確保


この方法で簡潔かつ Pythonic にリストの更新ができます!



コメント