鼠标滚轮+ tkinter中滚动条的问题
问题描述:
我想使用tkinter显示图像,添加滚动条时遇到了问题。如果图像超过窗口大小,我希望能够使用鼠标滚轮进行水平和垂直滚动。问题在于,当我使用画布时,鼠标滚轮不起作用。鼠标滚轮+ tkinter中滚动条的问题
在此代码我可以使用鼠标滚轮滚动Y和使用shift +鼠标滚轮滚动X(这是我想要什么):
import tkinter as tk
master = tk.Tk()
scrollbarX = tk.Scrollbar(master)
scrollbarX.pack(side=tk.BOTTOM, fill=tk.X)
scrollbarY = tk.Scrollbar(master)
scrollbarY.pack(side=tk.RIGHT, fill=tk.Y)
listbox = tk.Listbox(master, yscrollcommand=scrollbarY.set, xscrollcommand=scrollbarX.set)
for i in range(1000):
listbox.insert(tk.END, str(i)+"-----------------------------------------------------------------------")
listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=tk.YES)
scrollbarX.config(command=listbox.xview, orient=tk.HORIZONTAL)
scrollbarY.config(command=listbox.yview)
master.mainloop()
但是,如果我用帆布交换列表框,在mouswheel不再做任何事情。手动滚动仍然有效:
import tkinter as tk
from PIL import Image, ImageTk
master = tk.Tk()
scrollbarX = tk.Scrollbar(master)
scrollbarX.pack(side=tk.BOTTOM, fill=tk.X)
scrollbarY = tk.Scrollbar(master)
scrollbarY.pack(side=tk.RIGHT, fill=tk.Y)
canvas = tk.Canvas(master, bd=0, xscrollcommand=scrollbarX.set, yscrollcommand=scrollbarY.set)
imagefile = "image.png"
img = ImageTk.PhotoImage(Image.open(imagefile))
canvas.create_image(0,0,image=img, anchor="nw")
canvas.pack(fill=tk.BOTH, expand=tk.YES)
scrollbarX.config(command=canvas.xview, orient=tk.HORIZONTAL)
scrollbarY.config(command=canvas.yview)
canvas.config(scrollregion=canvas.bbox(tk.ALL))
master.mainloop()
我还是新手编程,非常感谢任何帮助!
答
您需要处理鼠标事件并进行滚动。
你可以做到这一点的有这样的回调:
def on_mousewheel(event):
shift = (event.state & 0x1) != 0
scroll = -1 if event.delta > 0 else 1
if shift:
canvas.xview_scroll(scroll, "units")
else:
canvas.yview_scroll(scroll, "units")
然后你把它绑定到canvas
这样的:
canvas.bind_all("<MouseWheel>", on_mousewheel)
感谢。所以我明白使用画布时没有内置的方式?因为它可以使用列表框在盒子外面工作。 – dudemeister
据我所知,当涉及到画布时,你必须自己传播鼠标事件等。 – Vallentin
这是一个无赖。谢谢你们的帮助。 – dudemeister