我有这个可滚动的框架(实际上是画布内的框架)。
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"
但是当我使用鼠标滚轮时滚动条不会移动。谁能帮我这个?我想要的只是当用户使用鼠标滚轮(在框架区域内/滚动条上)时,画布应自动向上或向下滚动。
答案 0 :(得分:43)
也许最简单的解决方案是为鼠标滚轮进行全局绑定。然后无论鼠标下的哪个小部件或哪个小部件具有键盘焦点,它都会触发。然后,您可以无条件地滚动画布,或者您可以很聪明并找出哪些窗口应滚动。
例如,在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
,但我不知道您定义根窗口的方式或方式。无论如何,这两个电话都是同义词。
平台差异:
<MouseWheel>
,您需要将event.delta
除以120(或其他因素,具体取决于您希望滚动的速度)<MouseWheel>
,您需要使用event.delta
而无需修改<Button-4>
和<Button-5>
,并且需要将event.delta
除以120(或其他因素,具体取决于您想要滚动的速度)< / LI>
有更多精确的解决方案涉及虚拟事件,并确定哪个窗口具有焦点或在鼠标下,或通过绑定传递画布窗口引用,但希望这将使您开始。
答案 1 :(得分:10)
基于@ 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")
答案 2 :(得分:8)
此链接为您提供了如何使用滚轮的示例。
我希望这有帮助!
# 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()
答案 3 :(得分:7)
为了摆脱奇怪的因素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()
答案 4 :(得分:1)
如果您有兴趣
#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()
答案 5 :(得分:1)
作为对上述内容的补充,“delta”比例因子很容易计算,因为平台信息可通过 sys
和 platform
模块(以及可能的其他模块)获得。
def my_mousewheel_handler(event):
if sys.platform == 'darwin': # for OS X # also, if platform.system() == 'Darwin':
delta = event.delta
else: # for Windows, Linux
delta = event.delta // 120 # event.delta is some multiple of 120
if event.widget in (widget1, widget2, ):
'do some really cool stuff...'