Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Imágenes con tkinter en distintas ventanas
#1
Buenas tardes

Como indiqué en mi presentación, estoy estudiando python de manera autodidacta. Para practicar, estoy haciendo una app de escritorio para controlar acuarios (otro de mis hobbys).

Ahora mismo estoy atascado con las imágenes, pues no logro visionarlas donde quiero.

En principio, el código abre una ventana principal a la que he añadido un botón y algunas etiquetas.

El botón abre una nueva ventana para añadir un nuevo acuario, pero no hay manera de poder ver la imagen. He mirado con Gemini y he consultado varios documentos, pero realmente no sé dónde puede estar el error.

Agradecido de antemano por el tiempo dedicado, un saludo
Raúl

Código:
import tkinter as tk
from tkinter import PhotoImage
from tkinter import *

# PNG iconos
ruta_add_icon = "E:\\GA\\Icons\\add.png"

# PNG imagenes
ruta_img_nuevo_acuario = "E:\\GA\\Images\\New_aquarium.png"

# Función para mostrar la pantalla de añadir nuevo acuario
def Nuevo_acuario():
    # Crear ventana para nuevo acuario
    Nuevo_acuario = tk.Toplevel()
    Nuevo_acuario.geometry("800x600")
    Nuevo_acuario.title("Nuevo acuario")
    etiqueta_nuevo_acuario = tk.Label(Nuevo_acuario,text="Añadir nuevo acuario", font=("Arial", 14))
    logo = tk.PhotoImage(file=ruta_img_nuevo_acuario)
    imagen_nuevo_acuario = tk.Label(image=logo)
    imagen_nuevo_acuario.pack()
    imagen_nuevo_acuario.place(x=200,y=50)
    etiqueta_nuevo_acuario.pack()
    etiqueta_nuevo_acuario.place(x=300,y=350)
    # ... (Agregar código para añadir acuario)


def leer_archivo_txt(ruta_user):
  try:
    with open(ruta_user, "r") as archivo:
      primera_linea = archivo.readline().strip()  # Lee la primera línea y elimina espacios
      return primera_linea
  except FileNotFoundError:
    print(f"Error: El archivo '{ruta_user}' no existe.")
  except Exception as e:
    print(f"Error al leer el archivo: {e}")

ruta_user = "E:\\GA\\User.txt"
user = leer_archivo_txt(ruta_user)

if user:
  print(f"Nombre de usuario leído: {user}")
else:
  print("Error al leer el archivo.")

# Crear la ventana principal
ventana_principal = tk.Tk()
ventana_principal.geometry("600x400")
ventana_principal.title("Control de acuarios, by Rul_T")
# Etiqueta de bienvenida
etiqueta_bienvenida = tk.Label(text="¡Bienvenido a la aplicación de control de tus acuarios!", font=("Arial", 14))
etiqueta_bienvenida.pack()
etiqueta_bienvenida.anchor="center"
etiqueta_bienvenida.place(x=80,y=20)

# Crear usuario
if user == "User0":
  user = input("¿Indica tu nombre?")
  def crear_archivo_txt(ruta_user, contenido):
    try:
        with open(ruta_user, "w") as archivo:
          archivo.write(contenido)
          print(f"Archivo '{ruta_user}' creado con éxito.")
    except Exception as e:
      print(f"Error al crear el archivo: {e}")
  contenido = user
  crear_archivo_txt(ruta_user, contenido)

# Etiqueta de usuario
etiqueta_usuario = tk.Label(text= "Me alegro de verte, " + user, font=("Arial", 14))
etiqueta_usuario.pack()
etiqueta_usuario.place(x=150,y=50)

# Botón para acceder a la pantalla de gestión de acuarios
add_icon = PhotoImage(file=ruta_add_icon)
boton_nuevo_acuario = tk.Button(
    width=45,
    height=45,
    command=Nuevo_acuario,
    image=add_icon,
    compound="top"
    )
boton_nuevo_acuario.pack()
boton_nuevo_acuario.place(x=125,y=100)

# Etiquetas Ventana Principal
etiqueta_nuevo_acuario = tk.Label(text= "Añadir nuevo acuario", font=("Arial", 14))
etiqueta_nuevo_acuario.pack()
etiqueta_nuevo_acuario.place(x=220,y=120)
logo = tk.PhotoImage(file=ruta_img_nuevo_acuario)
imagen_nuevo_acuario = tk.Label(image=logo)
imagen_nuevo_acuario.pack()
imagen_nuevo_acuario.place(x=200,y=50)

                            # Iniciar el bucle principal de la ventana principal
ventana_principal.mainloop()

Pues no entiendo nada, unas veces me funciona y otras no!
Responder
#2
Buenas, Rul_T. Voy a intentar responder tu pregunta sin enrrollarme mucho en el desarrollo (es tarde para mí, hace sueño, pero no quise dejarte sin respuesta). De todas maneras, si algo no entiendes, puedes preguntar tranquilo.

Lo primero de todo, he modificado tu código dejando sólo el código correspondiente al problema en sí (la falta de imagen en la ventana emergente, o top level). Esto es muy práctico cuando pasamos código a otra persona para que nos ayude con un error. Depuramos nuestro código (o lo copiamos en otro lado) y mandamos sólo aquello que nos presenta problema. Ahorra tiempo al que pueda ayudarte.

Y luego, y ya que estaba en eso, lo he depurado. Te invito a compararlo con el tuyo para que veas las diferencias porque algunas ya se me escaparon pero, por ejemplo, he sacado todos los .pack() ya que no son necesarios, y también he quitado la línea from tkinter import PhotoImage.

Bueno, aquí te dejo el código. Si bien está modificado, está basado en el tuyo. Presta atención a la línea top_imagen_nuevo_acuario.image = logo2 ya que sin esa línea, la imagen no aparece en la emergente (puedes probarlo comentándola y verás eso).

Código:
import tkinter as tk
from tkinter import *


# Crear la ventana principal
ventana_principal = tk.Tk()
ventana_principal.geometry("1200x800")
ventana_principal.title("Control de acuarios, by Rul_T")

# Etiquetas Ventana Principal

logo = tk.PhotoImage(file="gota.png")
imagen_nuevo_acuario = tk.Label(image=logo)
imagen_nuevo_acuario.place(x=200,y=500)


# Función para mostrar la pantalla de añadir nuevo acuario
def Nuevo_acuario():
    # Crear ventana para nuevo acuario
    nuevo_acuario = tk.Toplevel()
    nuevo_acuario.geometry("1200x800")
    nuevo_acuario.title("Nuevo acuario")

    logo2 = tk.PhotoImage(file="gota.png")
    top_imagen_nuevo_acuario = tk.Label(nuevo_acuario, image=logo2)
    top_imagen_nuevo_acuario.image = logo2
    top_imagen_nuevo_acuario.place(x=100,y=200)

    id_label = Label(nuevo_acuario, text="Añadir nuevo acuario")
    id_label.place(x=20, y=20)

    # ... (Agregar código para añadir acuario)


# Botón para acceder a la pantalla de gestión de acuarios
add_icon = PhotoImage(file="gota.png")
boton_nuevo_acuario = tk.Button(
    width=155,
    height=195,
    command=Nuevo_acuario,
    image=add_icon,
    )

boton_nuevo_acuario.place(x=270,y=250)



                            # Iniciar el bucle principal de la ventana principal
ventana_principal.mainloop()

Dejo aquí, pero si necesitas algo avisa, que no hay problema.
Mucha suerte!
Responder
#3
Diego, muchas gracias por la respuesta.

Tenía dudas si poner todo el código o solo una parte, ahora ya lo tengo claro para las futuras dudas que tendré.

Finalmente he conseguido que funcionara, añadiendo la línea


Código:
top_imagen_nuevo_acuario.image_names = logo2

Lo que no entiendo es por qué necesito esta línea de código en la ventana "nueva", pero no es necesario en la ventana principal.

Sigo con el desarrollo hasta ver donde me paro de nuevo jeje...
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)