このスクロール可能なフレーム(実際にはキャンバス内のフレーム)があります。
import Tkinter as tk
class Scrollbarframe():
def __init__(self, parent,xsize,ysize,xcod,ycod):
def ScrollAll(event):
canvas1.configure(scrollregion=canvas1.bbox("all"),width=xsize,height=ysize,bg='white')
self.parent=parent
self.frame1=tk.Frame(parent,bg='white')
self.frame1.place(x=xcod,y=ycod)
canvas1=tk.Canvas(self.frame1)
self.frame2=tk.Frame(canvas1,bg='white',relief='groove',bd=1,width=1230,height=430)
scrollbar1=tk.Scrollbar(self.frame1,orient="vertical",command=canvas1.yview)
canvas1.configure(yscrollcommand=scrollbar1.set)
scrollbar1.pack(side="right",fill="y")
canvas1.pack(side="left")
canvas1.create_window((0,0),window=self.frame2,anchor='nw')
self.frame2.bind("<Configure>",ScrollAll)
ユーザーがスクロールバーの矢印ボタンを使用せずにフレームを下にスクロールできるように、マウスホイールをスクロールバーにバインドします。見回した後、このようにcanvas1
にバインディングを追加しました
self.frame1.bind("<MouseWheel>", self.OnMouseWheel)
これは機能です:
def OnMouseWheel(self,event):
self.scrollbar1.yview("scroll",event.delta,"units")
return "break"
しかし、マウスホイールを使用するとスクロールバーが移動しません。誰もこれで私を助けることができますか?ユーザーがマウスホイール(フレーム領域内/スクロールバー上)を使用すると、キャンバスが自動的に上下にスクロールします。
おそらく最も簡単な解決策は、マウスホイールのグローバルバインディングを作成することです。マウスの下にあるウィジェットやキーボードフォーカスを持つウィジェットに関係なく起動します。その後、無条件にキャンバスをスクロールできます。または、賢く、どのウィンドウをスクロールするべきかを判断できます。
たとえば、Windowsでは次のようにします。
self.canvas = Canvas(...)
self.canvas.bind_all("<MouseWheel>", self._on_mousewheel)
...
def _on_mousewheel(self, event):
self.canvas.yview_scroll(-1*(event.delta/120), "units")
self.canvas.bind_all
は少し誤解を招く可能性があることに注意してください。より正確にroot.bind_all
を呼び出す必要がありますが、ルートウィンドウを何をどのように定義するのかわかりません。とにかく、2つの呼び出しは同義です。
プラットフォームの違い:
<MouseWheel>
にバインドし、event.delta
を120で除算する必要があります(またはスクロールの速さに応じて他の要素)<MouseWheel>
にバインドし、event.delta
を変更せずに使用する必要があります<Button-4>
および<Button-5>
にバインドする必要があり、event.delta
を120で除算する必要があります(またはスクロールの速さに応じて他の要因)仮想イベントに関連するより洗練されたソリューションがあり、どのウィンドウにフォーカスがあるか、マウスの下にあるかを判断するか、キャンバスウィンドウの参照をバインディングに渡すことで開始できます。
@BryanOakleyの答えに基づいて、フォーカスされたウィジェット(つまり、現在マウスカーソルが置かれているウィジェット)のみをスクロールする方法を次に示します。
次の方法で、キャンバス内にあるスクロール可能なフレームで発生する<Enter>
および<Leave>
イベントにバインドします(scrollframe
はキャンバス内のフレームです):
....
self.scrollframe.bind('<Enter>', self._bound_to_mousewheel)
self.scrollframe.bind('<Leave>', self._unbound_to_mousewheel)
return
def _bound_to_mousewheel(self, event):
self.canv.bind_all("<MouseWheel>", self._on_mousewheel)
def _unbound_to_mousewheel(self, event):
self.canv.unbind_all("<MouseWheel>")
def _on_mousewheel(self, event):
self.canv.yview_scroll(int(-1*(event.delta/120)), "units")
奇妙な要素120を取り除くために、event.delta値の符号を見ることができます。これにより、Windows、Linux、およびMac OSで同じハンドラーを簡単に使用できます。
# Mouse wheel handler for Mac, Windows and Linux
# Windows, Mac: Binding to <MouseWheel> is being used
# Linux: Binding to <Button-4> and <Button-5> is being used
def MouseWheelHandler(event):
global count
def delta(event):
if event.num == 5 or event.delta < 0:
return -1
return 1
count += delta(event)
print(count)
import tkinter
root = tkinter.Tk()
count = 0
root.bind("<MouseWheel>",MouseWheelHandler)
root.bind("<Button-4>",MouseWheelHandler)
root.bind("<Button-5>",MouseWheelHandler)
root.mainloop()
このリンクは、スクロールホイールの使用方法の例を示しています。
これがお役に立てば幸いです!
# explore the mouse wheel with the Tkinter GUI toolkit
# Windows and Linux generate different events
# tested with Python25
import Tkinter as tk
def mouse_wheel(event):
global count
# respond to Linux or Windows wheel event
if event.num == 5 or event.delta == -120:
count -= 1
if event.num == 4 or event.delta == 120:
count += 1
label['text'] = count
count = 0
root = tk.Tk()
root.title('turn mouse wheel')
root['bg'] = 'darkgreen'
# with Windows OS
root.bind("<MouseWheel>", mouse_wheel)
# with Linux OS
root.bind("<Button-4>", mouse_wheel)
root.bind("<Button-5>", mouse_wheel)
label = tk.Label(root, font=('courier', 18, 'bold'), width=10)
label.pack(padx=40, pady=40)
root.mainloop()
興味がある場合
#listbox scrollbar
from tkinter import *
root = Tk()
def scrolllistbox2(event):
listbox2.yview_scroll(int(-1*(event.delta/120)), "units")
scrollbar = Scrollbar(root)
#scrollbar.pack(side=RIGHT, fill=Y)
listbox = Listbox(root)
listbox.pack()
for i in range(100):
listbox.insert(END, i)
# attach listbox to scrollbar
listbox.config(yscrollcommand=scrollbar.set)
listbox.bind("<MouseWheel>", scrolllistbox2)
listbox2 = Listbox(root)
listbox2.pack()
for i in range(100):
listbox2.insert(END, i+100)
listbox2.config(yscrollcommand=scrollbar.set)
#scrollbar.config(command=listbox.yview)
root.mainloop()