如果你想要一个可滚动的图像小部件,最好的方法是创建一个可滚动图像类,它可以更好地整理并使代码更漂亮。因此,我为此创建了一个类,并添加了绑定
<MouseWheel>
,这样用户就可以通过鼠标方便地滚动查看图片。
以下是代码示例
import tkinter
class ScrollableImage(tkinter.Frame):
def __init__(self, master=None, **kw):
self.image = kw.pop('image', None)
sw = kw.pop('scrollbarwidth', 10)
super(ScrollableImage, self).__init__(master=master, **kw)
self.cnvs = tkinter.Canvas(self, highlightthickness=0, **kw)
self.cnvs.create_image(0, 0, anchor='nw', image=self.image)
self.v_scroll = tkinter.Scrollbar(self, orient='vertical', width=sw)
self.h_scroll = tkinter.Scrollbar(self, orient='horizontal', width=sw)
self.cnvs.grid(row=0, column=0, sticky='nsew')
self.h_scroll.grid(row=1, column=0, sticky='ew')
self.v_scroll.grid(row=0, column=1, sticky='ns')
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
self.cnvs.config(xscrollcommand=self.h_scroll.set,
yscrollcommand=self.v_scroll.set)
self.v_scroll.config(command=self.cnvs.yview)
self.h_scroll.config(command=self.cnvs.xview)
self.cnvs.config(scrollregion=self.cnvs.bbox('all'))
self.cnvs.bind_class(self.cnvs, "<MouseWheel>", self.mouse_scroll)
def mouse_scroll(self, evt):
if evt.state == 0 :
self.cnvs.yview_scroll(-1*(evt.delta), 'units')
self.cnvs.yview_scroll(int(-1*(evt.delta/120)), 'units')
if evt.state == 1:
self.cnvs.xview_scroll(-1*(evt.delta), 'units')
self.cnvs.xview_scroll(int(-1*(evt.delta/120)), 'units')
如何使用该类?
将 ScrollableImage
类视为Tkinter的小部件,就像使用其他Tkinter小部件一样。如果您查看tkinter源代码,您会发现每个小部件都是一个类。
有不同的方法可以使用 ScrollableImage
。
将上述代码保存到新的<name>.py
(例如:"scrollimage.py")文件中作为包,并在同一目录中导入到主类中,如 from scrollimage import ScrollableImage
,然后像正常小部件一样使用它。
或者可以在主文件的导入之后将 ScrollableImage
类放在顶部,然后像正常小部件一样使用它。
示例:
import tkinter as tk
from scrollimage import ScrollableImage
root = tk.Tk()
img = tk.PhotoImage(file="logo.png")
image_window = ScrollableImage(root, image=img, scrollbarwidth=6,
width=200, height=200)
image_window.pack()
root.mainloop()
在Windows上,绑定
<MouseWheel>
需要一些修改,例如将
event.delta
除以120。在macOS上不需要进行任何修改。而在X11上,你需要绑定
<Button-4>
、
<Button-5>
,并将
event.delta
除以120。
有关绑定
<MouseWheel>
在不同平台上的工作原理和详细信息,请参考上面提供的链接:
Tkinter Mousewheel Binding。
如果想要了解如何在Tkinter中正确应用OOPs,可以参考上面提供的链接:
Best way to structure Tkinter application.。使用OOPs时,你可以继承Tkinter的任何小部件并对其进行修改,以创建新的小部件和有用的类,从而更好地制作Tkinter应用程序。
scroll
需要整数值,而“1.0”是浮点值,修复很简单,只需将其转换为整数即可。我已经编辑了我的帖子并进行了修复。由于我使用的是Macos,无法测试它。希望现在能够正常工作。 - Saadself.cnvs.create_image(0, 0, anchor='nw', image=self.image)
来实现,但是没有任何变化。 - Юрій Ярош