Окно Tkinter Scrollabe с Zoom / Mouse Scroll и стрелками - PullRequest
0 голосов
/ 09 февраля 2020

Мне так нужна ваша помощь, я пытаюсь создать окно, которое отображает изображение, но это изображение ОГРОМНО, и мне нужно, чтобы окно было с прокруткой, и я хочу перемещаться, используя колесо прокрутки и стрелки клавиатуры , Что я знаю, что это возможно, но мне просто нужна помощь с кодом. Самая большая проблема, которую я нигде не мог найти, это увеличение и уменьшение масштаба в этом окне изображения.

Если вы можете мне помочь, я был бы очень признателен. Я использую 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 .: Это код, который я использую, но стрелки и колесо прокрутки не работают

1 Ответ

0 голосов
/ 09 февраля 2020

Как вы использовали 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()
...