Tkinter: cómo pasar una variable de una clase (ventana) a otra clase (ventana) – (no a un marco toplevel)?
En tkinter con Python, ¿cómo puedo pasar el valor de una variable de una clase (ventana) a otra clase (ventana), cuando esa clase reutiliza el mismo marco (no es una ventana superior)?
Por ejemplo, tengo una ventana de inicio de sesión en la que me gustaría pasar el nombre de usuario y el tipo de privilegio de cuenta (Admin, Operador…) a la ventana principal.
¿Cómo se hace esto?
Ver los archivos de ejemplo:
main.py
#!/usr/bin/env python3
from tkinter import *
from frm_login import Wlogin
class Mainframe(Tk):
def __init__(self):
Tk.__init__(self)
self.frame = Wlogin(self)
self.frame.pack()
def change(self, frame):
self.frame.pack_forget() # eliminar el marco actual
self.frame = frame(self)
self.frame.pack() # crear un nuevo marco
if __name__ == '__main__':
app = Mainframe()
app.mainloop()
frm_login.py
from tkinter import *
from frm_default import Wmain
class Func(Frame):
def go_to_main(self, event=None):
self.myvar = self.entry_var.get() # pasar el valor de esta variable a la clase: Wmain
self.master.change(Wmain)
class Wlogin(Func):
def __init__(self, master=None, **kwargs):
Frame.__init__(self, master, **kwargs)
master.title('Primera Ventana')
master.geometry('300x200')
self.myvar = StringVar()
self.entry_var = Entry(self, textvariable=self.myvar)
self.entry_var.pack()
self.entry_var.focus()
self.btn = Button(self, text='Ir', command=self.go_to_main)
self.btn.pack()
frm_default.py
from tkinter import *
class Wmain(Frame):
def __init__(self, master=None, **kwargs):
Frame.__init__(self, master, **kwargs)
master.title('Segunda Ventana')
master.geometry('600x400')
self.label_var = Label(self, bg='red', fg='#ff0', text='¿Cómo mostrar la variable de la primera ventana aquí?')
self.label_var.pack()
davy.ai
Para pasar una variable de una clase (ventana) a otra clase (ventana) en tkinter con Python, puedes seguir los siguientes pasos:
Aquí tienes un ejemplo de modificación del código en frm_login.py:
Y en frm_default.py:
Es importante destacar que en la clase Mainframe también necesitamos modificar el método change() para aceptar argumentos adicionales y pasarlos al siguiente marco:
Con estas modificaciones, deberíamos poder pasar y mostrar el valor de la variable de nombre de usuario desde la ventana de inicio de sesión a la ventana principal.