python3 & tkinter - создание кнопки масштабирования для увеличения загруженного изображения - PullRequest
0 голосов
/ 04 мая 2018

Я хотел бы создать кнопку масштабирования. При нажатии на эту кнопку масштабирования изображение будет увеличено с помощью коэффициента, представленного целым числом (1,2,3,4,5 ...). С этим фрагментом кода, нажав на кнопку масштабирования, под уже загруженной картинкой создается другая панель. Внутри пусто. Что было бы необходимо, чтобы: 1. убить первое (не масштабированное окно) и 2. загрузить увеличенное изображение на обновленной панели

from tkinter import *
from tkinter.filedialog import askopenfilename
import tkinter as tk

event2canvas = lambda e, c: (c.canvasx(e.x), c.canvasy(e.y))

root = Tk()

#setting up a tkinter canvas with scrollbars
frame = Frame(root, bd=2, relief=SUNKEN)
frame.grid_rowconfigure(0, weight=1)
frame.grid_columnconfigure(0, weight=1)
xscroll = Scrollbar(frame, orient=HORIZONTAL)
xscroll.grid(row=1, column=0, sticky=E+W)
yscroll = Scrollbar(frame)
yscroll.grid(row=0, column=1, sticky=N+S)
canvas = Canvas(frame, bd=0, xscrollcommand=xscroll.set,yscrollcommand=yscroll.set)
canvas.grid(row=0, column=0, sticky=N+S+E+W)
xscroll.config(command=canvas.xview)
yscroll.config(command=canvas.yview)
frame.pack(fill=BOTH,expand=1)

#adding the image
image_str="image.png"
image = tk.PhotoImage(file=image_str)
image = image.zoom(1,1)
canvas.create_image(0,0,image=image,anchor="nw")
canvas.config(scrollregion=canvas.bbox(ALL))

def zoomin():
   root = Tk()
   frame = Frame(root, bd=2, relief=SUNKEN)
   frame.grid_rowconfigure(0, weight=1)
   frame.grid_columnconfigure(0, weight=1)
   xscroll = Scrollbar(frame, orient=HORIZONTAL)
   xscroll.grid(row=1, column=0, sticky=E+W)
   yscroll = Scrollbar(frame)
   yscroll.grid(row=0, column=1, sticky=N+S)
   canvas = Canvas(frame, bd=0, xscrollcommand = xscroll.set, yscrollcommand = yscroll.set)
   canvas.grid(row=0, column=0, sticky=N+S+E+W)
   xscroll.config(command=canvas.xview)
   yscroll.config(command=canvas.yview)
   frame.pack(fill=BOTH,expand=1)

image = tk.PhotoImage(file=image_str)
image = image.zoom(1,1)
canvas.create_image(0,0,image=large_img,anchor="nw")
canvas.config(scrollregion=canvas.bbox(ALL))   

toolbar = Frame(root, bg="blue")

insertButt = Button(toolbar, text="zoomin", command=lambda:zoomin())
insertButt.pack(side = LEFT, padx=2, pady=2)

toolbar.pack(side=TOP, fill = X)

#function to be called when mouse is clicked
def printcoords(event):
    #outputting x and y coords to console
    print (event.x,event.y)
#mouseclick event
canvas.bind("<Button 1>",printcoords)

#mouseclick event
canvas.bind("<ButtonPress-1>",printcoords)
canvas.bind("<ButtonRelease-1>",printcoords)

root.mainloop()

Я хотел бы поблагодарить @Symon за его вопрос stackoverflow . Я во многом вдохновился его кодом

1 Ответ

0 голосов
/ 04 мая 2018

Ну, причина того, что функция zoomin(img) не работает должным образом, состоит в том, что она возвращает в первой строке:

def zoomin(img):
    return     # Function returns here
    ... rest of code is never executed

Я подозреваю, что это связано с тем, что функция запускается при создании кнопки, а не при ее нажатии. Попробуйте вместо этого создать кнопку:

insertButt = Button(toolbar, text="zoomin", command=lambda:zoomin(img))

Теперь кнопка будет вызывать zoomin(img) при нажатии, а не при ее создании.

Масштабирование с помощью Tkinter

PhotoImage zoom допускает только целочисленные значения, что делает его немного ограниченным. Но вот пример:

from tkinter import *

root = Tk()
root.geometry('300x200')

field = Canvas(root, bg='tan1', highlightthickness=0)
field.grid(sticky='news')
photo = PhotoImage(file='test.gif')
field.create_image(0, 0, image=photo, anchor='nw')
scale = 1

def zoom(event=None):
    global scale, photo
    scale = scale * 2
    field.delete('all')
    photo = photo.zoom(x=scale, y=scale)
    field.create_image(0, 0, image=photo, anchor='nw')
    field.image = photo

root.bind('z', zoom)    # Bind "z" to zoom function
root.mainloop()

Если вы хотите увеличить изображение с помощью функции float, вам придется импортировать модуль для этого. Подушка кажется популярной. Но я не работал ни с одним из них, поэтому вам придется исследовать их самостоятельно.

...