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.

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()
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para pasar una variable de una clase (ventana) a otra clase (ventana) en tkinter con Python, puedes seguir los siguientes pasos:

    1. Define la variable en la clase donde se está inicializando (en este caso, la clase Wlogin).
    2. Cuando la variable necesita ser pasada a la siguiente clase (Wmain), asigna el valor de la variable a la instancia de la siguiente clase en el método de la clase actual (go_to_main).
    3. En la siguiente clase (Wmain), accede a la variable asignada a través de su instancia que fue pasada desde la clase anterior.

    Aquí tienes un ejemplo de modificación del código en frm_login.py:

    class Func(Frame):
        def go_to_main(self, event=None):
            self.myvar = self.entry_var.get()
            self.master.change(Wmain, username=self.myvar) # asigna el valor de myvar a la instancia de la siguiente clase
    
    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()
    

    Y en frm_default.py:

    class Wmain(Frame):
        def __init__(self, master=None, username='', **kwargs): # acepta el argumento de username
            Frame.__init__(self, master, **kwargs)
            master.title('Segunda Ventana')
            master.geometry('600x400')
    
            self.label_var = Label(self, bg='red', fg='#ff0', text=username) # muestra la variable de username pasada
            self.label_var.pack()
    

    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:

    class Mainframe(Tk):
        def __init__(self):
            Tk.__init__(self)
            self.frame = Wlogin(self)
            self.frame.pack()
    
        def change(self, frame, **kwargs): # acepta argumentos de palabras clave
            self.frame.pack_forget()
            self.frame = frame(self, **kwargs) # pasa los argumentos de palabras clave al nuevo marco
            self.frame.pack()
    
    # ...
    
    if __name__== '__main__':
        app = Mainframe()
        app.mainloop()
    

    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.

Comments are closed.