es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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()
“`

Tags:  , ,

Answer

  1. Avatar for 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:

    from PIL import ImageTk
    

    Luego, reemplaza esta línea en la función wheel(event):

    my_canvas.scale('all', x, y, scale, scale)
    

    Con estas líneas:

    pilimg = Image.open("C:/Users/bodig/Desktop/mario-clip-art-5.png") # abrir la imagen con PIL
    w, h = pilimg.size # obtener el tamaño de la imagen
    new_size = (int(w*imscale), int(h*imscale)) # calcular el nuevo tamaño basado en la escala de zoom
    pilimg = pilimg.resize(new_size) # redimensionar la imagen
    img = ImageTk.PhotoImage(pilimg) # crear un nuevo PhotoImage a partir de la imagen redimensionada
    my_canvas.itemconfigure(my_image, image=img) # actualizar el elemento del lienzo con la nueva imagen
    

    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.

Comments are closed.