鼠标滚轮+ 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) 
+0

感谢。所以我明白使用画布时没有内置的方式?因为它可以使用列表框在盒子外面工作。 – dudemeister

+0

据我所知,当涉及到画布时,你必须自己传播鼠标事件等。 – Vallentin

+0

这是一个无赖。谢谢你们的帮助。 – dudemeister