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.

Hacer clic en un botón en una de las ventanas crea una etiqueta en la otra ventana.

Quiero hacer una aplicación Python tkinter con múltiples ventanas.

Quiero poder hacer clic en un widget de botón (message_button) en una de las ventanas (PageOne) y que imprima un mensaje utilizando un widget de etiqueta en la otra ventana (PageTwo).

Lo he intentado con mi message_fun() (ver abajo), pero sólo puedo conseguir colocar la etiqueta en la misma ventana (PageOne).

También he intentado cambiar self por PageTwo en message_fun(), pero sólo me da un mensaje de error AttributeError: type object ‘PageTwo’ has no attribute ‘tk’.

Gracias por cualquier ayuda!

import tkinter as tk
from tkinter import ttk

class MyPages(tk.Tk):

def __init__(self, *args, **kwargs):
    tk.Tk.__init__(self, *args, **kwargs)
    container = tk.Frame(self)
    container.pack(side="top", fill="both", expand=True)

    self.frames = {}
    for F in (PageOne, PageTwo):
        frame = F(container, self)
        self.frames[F] = frame
        frame.grid(row=0, column=0, sticky="nsew")
    self.show_frame(PageOne)

def show_frame(self, cont):
    frame = self.frames[cont]
    frame.tkraise()

class PageOne(tk.Frame):

def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    title_label = tk.Label(self, text="Esta es la página uno", font=("Verdana", 12))
    title_label.pack(pady=10, padx=10)
    navigate_button = ttk.Button(self, text="Página dos", command=lambda: controller.show_frame(PageTwo))
    navigate_button.pack(side=tk.LEFT)

    message_button = ttk.Button(self, text="Botón de mensaje", command=self.message_fun)
    message_button.pack(side=tk.LEFT)

def message_fun(self):
    message_label = tk.Label(self.master.frames[PageTwo], text='Quiero este mensaje en la página dos', font=("Verdana", 12))
    message_label.pack(side=tk.LEFT)

class PageTwo(tk.Frame):

def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    title_label = tk.Label(self, text="Esta es la página dos", font=("Verdana", 12))
    title_label.pack(pady=10, padx=10)

    navigate_button = ttk.Button(self, text="Página uno", command=lambda: controller.show_frame(PageOne))
    navigate_button.pack(side=tk.LEFT)

app = MyPages()
app.mainloop()

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puede utilizar el widget Toplevel. Este widget le permite crear una nueva ventana que es independiente de la ventana principal.

    Luego, puede utilizar la función message_fun() para crear una nueva ventana con el widget de etiqueta, y luego utilizar el método destroy() para cerrar la ventana cuando haya terminado.

    Aquí hay un ejemplo de cómo puede hacer esto:

    import tkinter as tk 
    from tkinter import ttk
    
    class MisPaginas(tk.Tk):
    
        def __init__(self, *args, **kwargs):
            tk.Tk.__init__(self, *args, **kwargs)
            contenedor = tk.Frame(self)
            contenedor.pack(side="top", fill="both", expand = True)
    
            self.frames = {}
            for F in (PaginaUno, PaginaDos):
                frame = F(contenedor, self)
                self.frames[F] = frame
                frame.grid(row=0, column=0, sticky="nsew")
            self.show_frame(PaginaUno)
    
        def show_frame(self, cont):
            frame = self.frames[cont]
            frame.tkraise()
    
    
    class PaginaUno(tk.Frame):   
    
        def __init__(self, parent, controller):
            tk.Frame.__init__(self,parent)
            titulo_etiqueta = tk.Label(self, text="Esta es la página uno", font=("Verdana", 12))
            titulo_etiqueta.pack(pady=10,padx=10)
            navegar_boton = ttk.Button(self, text="Página dos", command=lambda: controller.show_frame(PaginaDos))
            navegar_boton.pack(side = tk.LEFT)
    
            mensaje_boton = ttk.Button(self, text="Botón de mensaje", command= self.mensaje_fun)
            mensaje_boton.pack(side = tk.LEFT)
    
        def mensaje_fun(self):    
            # Crear una nueva ventana
            nueva_ventana = tk.Toplevel(self)
            # Crear el widget de etiqueta en la nueva ventana
            mensaje_etiqueta = tk.Label(nueva_ventana, text='Quiero este mensaje en la página dos', font=("Verdana", 12))
            mensaje_etiqueta.pack(side = tk.LEFT)  
            # Cerrar la ventana cuando haya terminado
            nueva_ventana.destroy()
    
    class PaginaDos(tk.Frame):  
    
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)        
            titulo_etiqueta = tk.Label(self, text="Esta es la página dos", font=("Verdana", 12))
            titulo_etiqueta.pack(pady=10,padx=10)
    
            navegar_boton = ttk.Button(self, text="Página uno", command=lambda: controller.show_frame(PaginaUno))
            navegar_boton.pack(side = tk.LEFT)
    
    
    app = MisPaginas()
    app.mainloop()
    

Comments are closed.