初歩的なことで申し訳ありませんが、TkInterのListBoxは HTMLのDropDownListみたいに表示内容と内部で認識・送信される値が分かれている考え方ではないのでしょうか? 分かれているものと思い、要素の集団として辞書型を用意するのが妥当と考えていたら ネット上の事例は 表示内容だけのリスト(タプル)が目立つ気がします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア8760
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総合スコア21956
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/17 00:02