Python 鼠标滚轮出现故障+;tkinter中的滚动条

Python 鼠标滚轮出现故障+;tkinter中的滚动条,python,canvas,tkinter,scrollbar,mousewheel,Python,Canvas,Tkinter,Scrollbar,Mousewheel,我试图使用tkinter显示图像,但在添加滚动条时遇到问题。我想能够滚动鼠标滚轮水平和垂直,如果图像超过窗口大小。问题是当我使用画布时鼠标滚轮不工作 在这段代码中,我可以使用鼠标滚轮滚动Y,并使用shift+鼠标滚轮滚动X(这正是我想要的): 但是,如果我用画布交换listbox,mouswheel将不再执行任何操作。手动滚动仍然有效: import tkinter as tk from PIL import Image, ImageTk master = tk.Tk() scrollbar

我试图使用tkinter显示图像,但在添加滚动条时遇到问题。我想能够滚动鼠标滚轮水平和垂直,如果图像超过窗口大小。问题是当我使用画布时鼠标滚轮不工作

在这段代码中,我可以使用鼠标滚轮滚动Y,并使用shift+鼠标滚轮滚动X(这正是我想要的):

但是,如果我用画布交换listbox,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.bind_all("<MouseWheel>", on_mousewheel)
然后将其绑定到
画布
,如下所示:

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.bind_all("<MouseWheel>", on_mousewheel)
canvas.bind_all(“,在鼠标滚轮上)

您需要处理鼠标事件并进行滚动

您可以通过如下方式进行回调:

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.bind_all("<MouseWheel>", on_mousewheel)
然后将其绑定到
画布
,如下所示:

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.bind_all("<MouseWheel>", on_mousewheel)
canvas.bind_all(“,在鼠标滚轮上)

谢谢。所以我知道在使用canvas时没有内置的方式?因为它确实是使用列表框来开箱即用。据我所知,当涉及到画布时,你必须传播鼠标事件,就像你自己一样。这是一个令人沮丧的问题。谢谢大家的帮助。我在引入回调时发现了一个新问题。如果窗口比图像大(因此窗口边框上有一些空间),滚动条会被禁用(应该是这样),但我仍然可以滚动,现在孔图像会上下/左右移动,这是因为你没有给画布一个固定的大小。若要修复此问题,请添加如下内容
canvas.configure(width=img.width(),height=img.height())
。现在,当窗口大于图像时,您无法滚动。谢谢。所以我知道在使用canvas时没有内置的方式?因为它确实是使用列表框来开箱即用。据我所知,当涉及到画布时,你必须传播鼠标事件,就像你自己一样。这是一个令人沮丧的问题。谢谢大家的帮助。我在引入回调时发现了一个新问题。如果窗口比图像大(因此窗口边框上有一些空间),滚动条会被禁用(应该是这样),但我仍然可以滚动,现在孔图像会上下/左右移动,这是因为你没有给画布一个固定的大小。若要修复此问题,请添加如下内容
canvas.configure(width=img.width(),height=img.height())
。现在,当窗口大于图像时,无法滚动。