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 にリストの更新ができます!
コメント
コメントを投稿