Treeview では指定行の要素を問い合わせる事は出来ません。
各要素は子要素を持つことができる為、
実際に表示されている「行」を得るには、
各要素を上から順にカウントする必要があり、
データ構造として適切ではないからです。
- Item1
- Item1-1
- Item1-1-1
- Item1-2
- Item2
- Item2-1
- Item2-2
例えば、上の構造で6行目の Item2-1 を得るには、
Item1 の子要素を全て辿る必要があります。
もし、子要素を持たないフラットな構造のデータを扱う場合は、
以下の方法が使えます。
リストの要素一覧から item を参照
tree.selection_add(tree.get_children("")[99])
- 問題点:「無駄」という面からは、毎回リストを得る方が無駄が多い
但し、自分でリストで管理する方法では、順序も独自に管理する必要が出てくる為、
件数次第ですが、妥協案として採用するならこの方法。
Item の ID を直接指定
ID は16進数の連番の文字列なので、リストの要素が固定の場合 (※番号は1開始)
tree.selection_add("I{:03X}".format(100))
- 問題点: IDは生成順なので、順番を入れ替えた場合等には適さない
実行効率は、これが良いですが、
内部仕様に依存する為、堅牢なコードとは言えません。
運用によっては(順序の入れ替え等により)バグの原因になるリスクがあります。
相当な数の要素がない限り、この程度の効率化はあまり効果がありません。
また、その様な規模になった場合は、全てのデータを一度に Treeview の要素に入れること自体が問題で、別の効率化が必要になります。
他の解決策:
単純なリストの場合、可能なら Listbox の採用を検討して見て下さい。
もし、スプレッドシートのような表のウィジェットを
Treeview の column で実現しようとする場合は、
データ構造の相違が制限になる事があります。
(Table では簡単に出来るはずの操作が Treeview では手間になる、等)
tkinter の標準には表形式のデータを扱うウィジェットは無い為、
(tkinter.tix.TList がありましたが、現在は非推奨で保守されてません)
これ以上の効率化は、自分でウィジェットを実装するか、
外部ライブラリ等に頼ることになると思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/04 15:02