将 x 和 y 滚动条添加到 canvas

adding x and y Scrollbar to a canvas

正在创建一个将图像放置到 canvas 上的程序。我想在 canvas 上添加一个 X 轴和 Y 轴滚动条,但我不知道该怎么做。

我通常会使用框架,但我正在处理的程序使用 tkinter.Toplevel 而不是框架。

#----- Imports ---------------------
import os
import os.path
import sys

import tkinter
tk = tkinter
from tkinter import font

#----- Set flag for JPEG support ---
noJPEG = False
try:
    from PIL import Image
    Pimg = Image
    from PIL import ImageDraw
    Pdraw = ImageDraw.Draw
    from PIL import ImageTk
    Pimgtk = ImageTk
except ImportError:
    noJPEG = True
#

#------------------------------------
# Create an invisible global parent window to hold all children.
# Facilitates easy closing of all windows by a mouse click.
_root = tk.Tk()
_root.withdraw()
#


#------------------------------------
# A writeable window for holding an image.
#
class ImageView(tk.Canvas):

    def __init__(self, image, title=''):
        master = tk.Toplevel(_root)
        master.protocol("WM_DELETE_WINDOW", self.close)
        tk.Canvas.__init__(self, master,
                           width = 600, height = 500,
                           scrollregion=(0,0, image.getWidth(),
                                         image.getHeight()))

        # Define class fields
        ## Image properties
        self.master.title(title)
        self.pack()
        master.resizable(0,0)
        self.foreground = "black"
        self.image = image
        self.height = image.getHeight()
        self.width = image.getWidth()
        # for later
        #self.customFont = font.Font(family="Helvetica", size=12)

        ## Actionable items
        self.mouseX = None
        self.mouseY = None
        self.mouseFxn = None
        self.bind("<Button-1>", self.onClick)  #bind action to button1 click
        self.tags = None

        _root.update()  #redraw global window

使用 Toplevel 而不是 Frame 没有什么特别之处。您可以按照对任何容器中任何可滚动小部件的方式附加滚动条。

我从未见过小部件创建自己的父级。这很不寻常,尽管它确实没有改变任何东西。只需在顶层添加滚动条。

您可能想要切换到 grid 而不是 pack,因为这样可以更容易地使滚动条正确排列。您只需要删除对 self.pack() 的调用,并在您的代码中添加如下内容:

vsb = tk.Scrollbar(master, orient="vertical", command=self.yview)
hsb = tk.Scrollbar(master, orient="horizontal", command=self.xview)
self.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)

self.grid(row=0, column=0, sticky="nsew")
vsb.grid(row=0, column=1, sticky="ns")
hsb.grid(row=1, column=0, sticky="ew")
master.grid_rowconfigure(0, weight=1)
master.grid_columnconfigure(0, weight=1)