您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Python中使用滚动条显示大图

在Python中使用滚动条显示大图

如果您想要一个Scrollable图像小部件,那么最好的方法是创建一个Scrollable Image类,该类将对代码进行排列并使其看起来更好。因此,我为相同的对象创建一个类,并添加了绑定,<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)
        # Vertical and Horizontal scrollbars
        self.v_scroll = tkinter.Scrollbar(self, orient='vertical', width=sw)
        self.h_scroll = tkinter.Scrollbar(self, orient='horizontal', width=sw)
        # Grid and configure weight.
        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)
        # Set the scrollbars to the canvas
        self.cnvs.config(xscrollcommand=self.h_scroll.set, 
                           yscrollcommand=self.v_scroll.set)
        # Set canvas view to the scrollbars
        self.v_scroll.config(command=self.cnvs.yview)
        self.h_scroll.config(command=self.cnvs.xview)
        # Assign the region to be scrolled 
        self.cnvs.config(scrollregion=self.cnvs.b@R_236_2419@('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') # For MacOS
            self.cnvs.yview_scroll(int(-1*(evt.delta/120)), 'units') # For windows
        if evt.state == 1:
            self.cnvs.xview_scroll(-1*(evt.delta), 'units') # For MacOS
            self.cnvs.xview_scroll(int(-1*(evt.delta/120)), 'units') # For windows

ScrollableImage类视为Tkinter的小部件,并像使用其他任何Tkinter部件一样使用,因为如果您看到tkinter源代码,则每个其他小部件都是一个类。

您可以使用多种方法ScrollableImage

将上述代码作为包保存到同一目录中的新文件<name>.py (例如:“ scrollimage.py”) ,然后像这样导入到您的主类中from scrollimage import ScrollableImage,然后将其用作普通窗口小部件。

或者,您可以ScrollableImage在导入主文件后将类放在顶部,然后像平常一样使用它。

import tkinter as tk
# Import the package if saved in a different .py file else paste 
# the ScrollableImage class right after your imports.
from scrollimage import ScrollableImage

root = tk.Tk()

# PhotoImage from tkinter only supports:- PGM, PPM, GIF, PNG format.
# To use more formats use PIL ImageTk.PhotoImage
img = tk.PhotoImage(file="logo.png")

image_window = ScrollableImage(root, image=img, scrollbarwidth=6, 
                               width=200, height=200)
image_window.pack()

root.mainloop()

绑定<MouseWheel>需要在窗口上进行一些修改,例如除以event.delta120。在macOS上,不需要进行修改。而在X11,你需要绑定两个<Button-4><Button-5>并且还分event.delta120。

有关绑定<MouseWheel>及其在不同平台上如何工作的更多详细信息,请查看上面的链接

您可以参考上面的链接,详细了解如何在Tkinter中正确应用oop。使用OOP时,您始终可以继承Tkinter的任何小部件并对其进行修改,以创建新的小部件和有用的类,这些类将帮助您使Tkinter的应用程序更好。

python 2022/1/1 18:53:17 有492人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶