質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5047閲覧

tkinterのtreeviewにて、指定の行を選択する

hijiri

総合スコア61

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/02 12:17

tkinterにて、ボタンを押したら指定の行を選択したいと思っております。

たとえば、1と書かれたボタンを押したら、1番目の行を選択する。
100と書かれたボタンを押したら、100番目の行を選択する、といった具合にです。

tree.selection_add(item)

を使えばいいのかと思ったのですが、指定行のitemを取得する方法がわかりません。

treeviewにinsertするときに、arrayに全てのitemを格納しておいて、100を選択するときに

tree.selection_add(array[99])

といったように、その都度引っ張り出してくる方法を考えたのですが、ツリーの行数が増えれば増えるほどarrayに格納するitemの数が増えるので、無駄が多いような気がしてます。

何か良い方法があれば、どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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 03:59

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hijiri

2020/09/04 15:02

詳しい説明をありがとうございます。 フラットな構造のツリービューですので、教えていただいた方法で行こうと思います。 もっと、ツリービューについて勉強するようにいたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問