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()
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étododestroy()
para cerrar la ventana cuando haya terminado.Aquí hay un ejemplo de cómo puede hacer esto: