Tkinter Scrollable Window with Zoom/Mouse Scroll and Arrows

Tkinter Scrollabe Window with Zoom/Mouse Scroll and Arrows

我非常需要你的帮助,我正在尝试制作一个显示图像的 window,但是那个图像很大,我需要 window 是滚动条,我想要使用滚轮和键盘箭头进行导航。我知道这是可能的,但我只需要一些代码方面的帮助。我无法在任何地方解决的最大问题是放大和缩小该图像 window 导航。

如果你能帮助我,我将不胜感激。我正在使用 Tkinter,windows 为 类。

from tkscrolledframe import ScrolledFrame
sf = ScrolledFrame(self, width=6800, height=2180, bg="#273852")
    sf.pack(side="top", expand=1, fill="both")
    sf.bind_arrow_keys(self)
    sf.bind_scroll_wheel(self)
    inner_frame = sf.display_widget(tk.Frame)
    load = Image.open('overview.jpg')
    render = ImageTk.PhotoImage(load)
    img = tk.Label(inner_frame, image=render, bg="#273852", borderwidth=0, highlightthickness=0)
    img.image = render
    img.grid()

Ps.: 这就是我正在使用的代码,但是箭头和滚轮不起作用

正如您使用的 tkscrolledframe,下面是一个适用于我的 Windows 运行 Python 3:

的示例
import tkinter as tk
from tkscrolledframe import ScrolledFrame
from PIL import ImageTk, Image

root = tk.Tk()
root.geometry('800x600+100+100')

sf = ScrolledFrame(root)
sf.pack(fill=tk.BOTH, expand=1)

img = Image.open('images/big.png')
tkimg = ImageTk.PhotoImage(img)

imgbox = sf.display_widget(tk.Label, image=tkimg)
# make imgbox get focus when mouse clicked on it
imgbox.bind('<Button-1>', lambda e: imgbox.focus_set())

sf.bind_arrow_keys(imgbox)
sf.bind_scroll_wheel(imgbox)

# make imgbox get focus in order to receive key events
imgbox.focus_set()

root.mainloop()

如果您想要更多控制而不使用 tkscrolledframe,下面是另一个示例:

import tkinter as tk
from PIL import Image, ImageTk

root = tk.Tk()
root.geometry('800x600+400+300')

root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)

canvas = tk.Canvas(root)
vsb = tk.Scrollbar(root, orient=tk.VERTICAL, command=canvas.yview)
hsb = tk.Scrollbar(root, orient=tk.HORIZONTAL, command=canvas.xview)
canvas.config(xscrollcommand=hsb.set, yscrollcommand=vsb.set)

canvas.grid(row=0, column=0, sticky='nsew')
vsb.grid(row=0, column=1, sticky='ns')
hsb.grid(row=1, column=0, sticky='ew')

img = ImageTk.PhotoImage(file='images/big.png')
bgimg = canvas.create_image(0, 0, image=img, anchor=tk.NW)
canvas.config(scrollregion=(0, 0, img.width(), img.height()))

def scroll_horizontal(dx):
  canvas.xview_scroll(dx, 'units')

def scroll_vertical(dy):
  canvas.yview_scroll(dy, 'units')

canvas.bind('<MouseWheel>', lambda e: scroll_vertical(-e.delta//120))
canvas.bind('<Button-1>', lambda e: canvas.focus_set())

canvas.bind('<Up>', lambda e: scroll_vertical(-1))
canvas.bind('<Down>', lambda e: scroll_vertical(+1))
canvas.bind('<Left>', lambda e: scroll_horizontal(-1))
canvas.bind('<Right>', lambda e: scroll_horizontal(+1))

# if using bind_all, no need to call canvas.focus_set()
canvas.focus_set() # canvas must be focused to receive keyboard events

root.mainloop()