¿Por qué la imagen se mueve en lugar de agrandarse cuando se hace zoom en un lienzo de Tkinter?
Estoy teniendo problemas con una función de Zoom. El problema es que en lugar de ampliar la imagen, se mueve. Esto no es lo que quiero, pero no puedo entender qué está mal.
Aquí está el código que he escrito hasta ahora. Mover la imagen con el mouse funciona bien, solo el Zoom no funciona. Supongo que el problema está en la función weel(event):
“`python
import tkinter as tk
from tkinter import ttk, Canvas, PhotoImage, Label
from PIL import Image, ImageTk
root = tk.Tk()
root.title('Codemy.com')
root.geometry("1100×700")
w = 1000
h = 676
x = w/2
y = h/2
my_canvas = Canvas(root, width=w, height=h)
my_canvas.pack(pady=20)
<h1>Agregar imagen al lienzo</h1>
img = PhotoImage(file="C:/Users/bodig/Desktop/mario-clip-art-5.png")#Ruta de la imagen
my_image = my_canvas.create_image(260, 125, image=img)
def move(event):
global img
img = PhotoImage(file="C:/Users/bodig/Desktop/mario-clip-art-5.png")#Ruta de la imagen
my_image = my_canvas.create_image(event.x, event.y, image=img)
def wheel(event):
x = my_canvas.canvasx(event.x)
y = my_canvas.canvasy(event.y)
scale = 1.0
imscale = 1.0
delta = 1.3
# Responder al evento de rueda (event.delta)
if event.delta == -120: # hacer scroll hacia abajo
imscale /= delta
scale /= delta
if event.delta == 120: # hacer scroll hacia arriba
imscale *= delta
scale *= delta
my_canvas.scale('all', x, y, scale, scale) # redimensionar todos los objetos del lienzo
my_label = Label(root, text="")
my_label.pack(pady=20)
my_canvas.bind('<b1-motion>', move)
my_canvas.bind('<mousewheel>', wheel)
root.mainloop()
“`
davy.ai
Parece que el problema puede estar en la función wheel(event). La función está escalando el lienzo en lugar de la imagen, lo que podría estar haciendo que la imagen se mueva en lugar de hacer zoom.
Para solucionar esto, puedes utilizar el método ImageTk de PIL para crear una versión de la imagen que se pueda redimensionar sin afectar el lienzo.
En primer lugar, agrega la siguiente declaración de importación en la parte superior de tu código:
Luego, reemplaza esta línea en la función wheel(event):
Con estas líneas:
Esto redimensionará la imagen utilizando PIL y luego creará un nuevo PhotoImage a partir de la imagen redimensionada. Por último, actualizará el elemento del lienzo con la nueva imagen para lograr el zoom en lugar de moverse.