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.

¿Cómo puedo eliminar un marco por nombre de atributo?

Tengo 5 botones que se inicializan en marcos individuales, ¿cómo puedo eliminar un marco que un usuario ha ingresado específicamente para eliminar el marco? Estoy buscando saber cómo eliminar marcos anidados mediante la entrada del usuario. La razón es que estoy desarrollando un juego de cartas que tiene un diseño complejo donde los marcos contendrán más que solo botones, pero quiero destruir los marcos según la entrada.

from tkinter import *
root = Tk()

for y in range(0,5):
  frame = Frame(root,name = str(y))
  button = Button(frame,text=str(y))
  print(frame)
  frame.pack()
  button.pack()

entry = Entry(root)
entry.pack()

def delete():
  buttonToDelete = int(entry.get())
  # ¿Qué va aquí para destruir el marco según la entrada del usuario? He intentado
  frame.name(buttonToDelete).destroy()

deleteButton = Button(root, text="Eliminar",command=delete)
deleteButton.pack()

mainloop()
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para eliminar un marco ingresado por el usuario, puedes asignar un nombre o atributo único a cada marco en el bucle que inicializa los marcos. Por ejemplo, puedes asignar el atributo frame_id con un valor de y a cada marco:

    for y in range(0,5):
      frame = Frame(root, name=str(y))
      frame.frame_id = y
    

    Luego, en la función delete(), puedes recuperar el frame_id del marco a eliminar a partir de la entrada del usuario y usarlo para encontrar el marco correspondiente recorriendo root.winfo_children():

    def delete():
      frameToDelete = int(entry.get())
      for frame in root.winfo_children():
        if hasattr(frame, "frame_id") and frame.frame_id == frameToDelete:
          frame.destroy()
          break
    

    Este bucle busca todos los hijos directos de root, verifica si tienen un atributo frame_id y si coincide con el valor ingresado por el usuario frameToDelete, destruye el marco utilizando el método destroy().

    Ten en cuenta que debes usar if hasattr(frame, "frame_id") para evitar errores si algún widget hijo de root no tiene un atributo frame_id, y usa break para salir del bucle una vez que se elimina el marco, ya que el frame_id único garantiza que solo haya un marco que coincida con la entrada del usuario.

Comments are closed.