listboxにスクロールバーを付ける

listboxを使用するのは簡単ですが、選択要素が増えるとスクロールボタンが必要になります。

これが結構面倒くさい。 やっとその方法を見つけました。
結論を言うと、canvasやformを作りその上にwidget(部品)を載せるやり方です。
特に関数(def show_letter())の所を覚えておかないと、次回も手こずります。

 

 # listboxに縦スクロールバーを付ける.py 2/18/2021 OK 
 # ttk使用せず、canvas上にlistboxを表示 2/22/2021 
 # canvasでもframeでもそのまま入れ替えれば動作する 
   
1import tkinter as tk 
2  
3# rootウィンドウの設定 
4root = tk.Tk() 
5root.title("scroll app") 
6root.geometry("200x200") 
7  
8label_1 = tk.Label(root, text="Your selection", bg="yellow") 
9label_1.place(x=60, y=120) 
10  
11# listboxを載せるcanvasの作成と設置 
12#******************* 
13canvas = tk.Canvas(root) 
14canvas.pack(padx=0, pady=30) 
15  
16# Listboxの選択肢 
17letters = ('All', 'a', 'b', 'c', 'd', 'd', 'f') 
18lists = tk.StringVar(value=letters) 
19  
20# 各種ウィジェットの作成 
21listbox = tk.Listbox(canvas, listvariable=lists, width=5, height=4) 
22  
23# スクロールバーの作成 
24scrollbar = tk.Scrollbar(canvas, orient=tk.VERTICAL, command=listbox.yview) 
25  
26# スクロールバーをListboxに反映 
27listbox["yscrollcommand"] = scrollbar.set 
28  
29# 各種ウィジェットの設置 
30listbox.grid(row=0, column=0) 
31scrollbar.grid(row=0, column=1, sticky=(tk.N, tk.S)) 
32  
33#************************ 
34  
35#listboxから選んだ文字を表示する 
36#-------------------------- 
37def show_letter(): 
38    for i in listbox.curselection(): 
39        selected_letter = listbox.get(i) 
40    label_1["text"] = selected_letter 
41  
42btn_1 = tk.Button(root, width=12, text="Click here", 
43                  bg="light blue", command=show_letter) 
44btn_1.place(x=50, y=150) 
45#---------------------------- 
46  
47root.mainloop() 

 

左:選択前     右:選択後

 

 

 

シニア別館
英語の一言

NHKの実践ビジネス英語に面白いのが出ているので、ここに書いて覚えよう。ということで、暫く書いてみま …

シニア別館
近郊スナップ

ランチ時や犬の散歩時に、出来るだけ人込みを避けて撮ってます。 玉川より日本遺産「大山」を望む 森の里 …

シニア別館
小田原フラワーガーデン

今の時期まだ彩は期待できないけれど、ドライブを兼ねて出かけました。 温室に咲いているはずの …