頭の中は異空間

ものづくり中心

【Python】【Tk】treeview(表)の選択状態についての注意点

ttk.treeviewの表形式で登録データを総入れ替え(delete→insert)なんかするときに悩むであろう罠について。

 

データをすべてtreeview.deleteしたとき、選択中だったデータの選択状態が強制的に外れます

明示的に言えば、treeviewを見た目で選択した状態の「選択」と内部的に選択した状態の「フォーカス」に分かれます。これを元に戻すには、「選択」と「フォーカス」の2つを動的に行う必要があります。

 

# データ全削除
tree.delete(*tree.get_children())

この時点で選択、フォーカスの2つが外れた状態になっています。そのため、本当の意味で表のデータを再選択するには下記(1), (2)の双方が必要です。

# (1)データのフォーカス(プログラム上で内部的に選択した状態)
tree.focus(iid)

 

# (2) データの選択(見た目上で選択された状態)
tree.selection_set(iid)

 

focus(iid)することで、例えば下記のように選択中のデータを取得できたりします。

focused_record = tree.item(tree.focus())['values']

また、selection_set(iid)することで見た目的にもどれを選択中か見せられるのでユーザにとっても親切な作りになります。

 

肝心のiidはデータをinsertするときに返り値として取得可能です。

for record in data:
iid = tree.insert("","end",values=(record))

 

あとは、全データ(data)のループ内でfocused_record == recordのときにfocus, selection_setすることで再選択を実現できます。