Scrollbarとは
これです。
ListboxではSccrollbarを実装しないとScrollbarは使えません。それに比べComboboxではスクロールが必要なときに自動でスクロールバーがあらわれます。tkinterには.Listboxがありません。tkinter.ttkにありいます。後からサポートされたウィジェット?
Windowsでは様々なビューでスクロールバーをもっているのは、当たり前です。
このスクロールバーは譜面を上下左右にスクロールさせるのが目的です。 データの設定画面などでもよく使われます。
スクロールバーを動かして値を設定します。しかし、tkinterのScrollbarではこれができません。
Scrollbarは、Listboxなどの 外注的な役目を果たし、自分では何もできない。 ということが分かるまでちょっと時間がかかりました。
Windowsとは同じではないのです。コードを見てみましょう。
import tkinter as tk
if __name__ == "__main__":
root = tk.Tk()
root.title('Scrollbar on Listbox')
root.geometry("200x100")
# Frame
frame = tk.Frame(root, width=200, height= 100)
frame.grid()
# Combobox create
makers = ['Toyota', 'Nissan', 'Honda', 'Mitubishi',
'Suzuki', 'Daihatsu', 'Subaru', 'BMW', 'Ford']
val = tk.StringVar(value=makers)
lb = tk.Listbox(
frame,
listvariable =val,
selectmode='normal',
height=4,
)
lb.grid(row=0, column=0)
#Scrollbar create
sbar = tk.Scrollbar(frame, orient=tk.VERTICAL)
sbar.config(command=lb.yview)
lb.config(yscrollcommand=sbar.set)
sbar.grid(row=0, column=1, sticky=(tk.N, tk.S))
root.mainloop()
height=4は4ドットではなく4行のことです。
①bar.config(command=lb.yview)
これでスクロールバーの矢印ボタンを押すとスクロールします。しかし、これだけだとスクロールバーの現在位置は変わりません。
リストボックス ← スクロールバー
lb.config(yscrollcommand=sbar.set)
リストボックスのyscrollcommandはsbar.setをセットします。スクロールバーの現在位置は変わふぃます。しかし、これだけだとスクロールバーの矢印ボタンが無効です。
リストボックス → スクロールバー
①と②を実施することにより正常なスクロールの機能が実現します。
CanvasにScrllbarをつけてみました。
実装はListboxと同じです。スクロールバーを操作すると青の丸が上下に移動します。
import tkinter as tk
if __name__ == "__main__":
root = tk.Tk()
root.title('Scrollbar')
root.geometry("300x200")
#create canvas
canvas = tk.Canvas(root, bg="pink")
canvas.place(x=0, y=0, width=250, height=200)
#Scrollbar
scrollbar = tk.Scrollbar(canvas, orient=tk.VERTICAL)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
scrollbar.config(command=canvas.yview)
canvas.config(yscrollcommand=scrollbar.set)
# Canvasのスクロール範囲を設定
canvas.config(scrollregion=(0, 0, 300, 500))
canvas.create_oval(105, 80, 145, 120, fill='blue')
root.mainloop()
Listboxはアイテムの数でスクロールの条件が成立します。しかし、Canvasでは一義的に条件が決まらないのでスクロールする範囲を設定します。
canvas.config(scrollregion=(0, 0, 300, 500))
ScrollbarがCanvasの外注として機能しています。 |