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することで再選択を実現できます。