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

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

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

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

Python

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

Q&A

解決済

2回答

4374閲覧

Python TkInterのListBoxは 表示内容と内部のvalue値という考え方は ないのでしょうか?

saya24

総合スコア247

Tkinter

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

Python

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

0グッド

1クリップ

投稿2020/05/16 17:15

初歩的なことで申し訳ありませんが、TkInterのListBoxは HTMLのDropDownListみたいに表示内容と内部で認識・送信される値が分かれている考え方ではないのでしょうか? 分かれているものと思い、要素の集団として辞書型を用意するのが妥当と考えていたら ネット上の事例は 表示内容だけのリスト(タプル)が目立つ気がします。

選択されたアイテムの把握はインデックスという考え方だからでしょうか??? なんか頭が混乱してきました...。
イメージ説明

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

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

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

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

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

guest

回答2

0

tkinter.Listbox に関してはその通りで、シンプルな文字選択のみです。

tix というtkinterのウィジェットライブラリが標準ライブラリにあり、
替えとなるリストボックスの実装が幾つかあったのですが、
3.6 以降は保守されてないようなので、現在は非推奨。
替わりに ttk の利用が提案されてます。

ttk のウィジェット一覧を探してみても、リストそのものは見当たらないのですが、
他の方法として、ttk.Treeview をリストボックスとして使う方法があります。

python

1import tkinter as tk 2from tkinter import ttk 3 4root = tk.Tk() 5treeView = ttk.Treeview(root) 6treeView.pack(fill=tk.BOTH) 7 8## リストとして使うための準備 9treeView.config( 10 show="", # ヘッダーとツリー用アイコン領域を非表示 11 columns=["label", "value"], # 任意の column を設定可能 12 displaycolumns=["label"], # 表示用に使う column を指定 13 selectmode="browse", # 複数選択の禁止 14) 15 16## Sample Data 17treeView.insert("", "end", values=("1月", "jan")) 18treeView.insert("", "end", values=("2月", "feb")) 19treeView.insert("", "end", values=("3月", "mar")) 20 21def onTreeSelectedMulti(event): 22 # 複数選択の場合は、forループで処理 23 view = event.widget 24 for idx in view.selection(): 25 label, value = view.item(idx, "values") 26 print(">", label, value) 27 28def onTreeSelectedSingle(event): 29 # 単一選択の場合は現在のアクティブな行のみ 30 view = event.widget 31 label, value = view.item(view.focus(), "values") 32 print(">", label, value) 33 34# treeView.bind("<<TreeviewSelect>>", onTreeSelectedMulti) 35treeView.bind("<<TreeviewSelect>>", onTreeSelectedSingle) 36 37root.mainloop()

辞書を用いる場合は、
python3.6以降でないと、キーの順序が保証されてない事に気を付けてください。
後方互換が必要な場合は、順序付きのcollections.OrderedDictが適切です。

投稿2020/05/16 21:03

teamikl

総合スコア8760

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

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

saya24

2020/05/17 00:02

いつも丁寧なご支援をありがとうございます。今回はそこまで拘りがないので、treeViewの利用までは対応しませんが、将来絶対役に立つと思います。助かります。
guest

0

ベストアンサー

Python TkInterのListBoxは 表示内容と内部のvalue値という考え方は ないのでしょうか?

ListBox のアイテムは文字列以外は許可されておらず、内部の値と表示する値という概念もありません。
表示する値と内部の値をそれぞれキー、値とした辞書を用意しておいて、リストボックスにはそのキーだけ設定して、あとから辞書を参照して値を取得するというやり方しかないと思います。

python

1from tkinter import * 2from tkinter import ttk 3 4 5def listbox_selected(event): 6 for i in listbox.curselection(): 7 key = listbox.get(i) 8 print(key, items[key]) 9 10 11root = Tk() 12 13items = { 14 "AAA": 1, 15 "BBB": 2, 16 "CCC": 3 17} 18 19listbox = Listbox(root, listvariable=StringVar(value=list(items.keys()))) 20listbox.bind('<<ListboxSelect>>', listbox_selected) 21listbox.grid(row=0, column=0) 22 23root.mainloop()

投稿2020/05/16 17:57

編集2020/05/16 17:58
tiitoi

総合スコア21956

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

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

saya24

2020/05/17 00:05

初めてListBoxを使ってみる私にちょうど良く分かりやすい説明でした、有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問