Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Variables de una función en otra. Listeners

Estas en el tema de Variables de una función en otra. Listeners en el foro de Python en Foros del Web. Estoy tratando de hacer un formulario con GUI (tkinter) pues es el tema que estoy viendo en Java actualmente, y me gustaría codificar mis tareas ...
  #1 (permalink)  
Antiguo 02/03/2013, 16:30
Avatar de Chezzy  
Fecha de Ingreso: marzo-2013
Ubicación: Mérida, Yucatán, México
Mensajes: 2
Antigüedad: 11 años, 8 meses
Puntos: 0
Variables de una función en otra. Listeners

Estoy tratando de hacer un formulario con GUI (tkinter) pues es el tema que estoy viendo en Java actualmente, y me gustaría codificar mis tareas también en Python. Mi pregunta es ¿cómo puedo llamar a las variables de una función (método), u obtener su valor dentro de otra función? Aquí dejo mi script:

Código:
from tkinter import *
from tkinter.ttk import *

class Formulario(Frame):

    def __init__(self, Contenedor):

        Frame.__init__(self, Contenedor)

        self.Contenedor = Contenedor

        self.CreaGUI()

    def CreaGUI(self):

        self.Contenedor.title("Formulario de Inscripción")
        self.style = Style()
        self.style.theme_use("default")

        Nombre = Label(self.Contenedor, text = "Nombre: ").grid(row = 0, sticky = W)
        CampoTexto = Entry(self.Contenedor, width = 40)
        CampoTexto.grid(row = 0, column = 1)

        X = IntVar()
        Sexo = Label(self.Contenedor, text = "Sexo: ").grid(row = 1, pady = 30, sticky = W)
        M = Radiobutton(self.Contenedor, text = "M", variable = X, value = 1)
        M.grid(row = 1, column = 1, sticky = W)
        F = Radiobutton(self.Contenedor, text = "F", variable = X, value = 2)
        F.grid(row = 1, column = 1, sticky = W, padx = 50)

        Aceptar = Button(self.Contenedor)
        Aceptar.configure(text = "Aceptar", command = self.Listener)
        Aceptar.grid(row = 2, column = 1)

    def Listener(self):

        self.CreaGUI()

        Name = self.CampoTexto.get()
        Sex = 0

        if Sex == self.M.selection_get():

            print("Masculino")

        else:

            print("Femenino")

        print(Name, ", ", Sex)




if __name__ == '__main__':

    root = Tk()
    root.geometry("340x150")

    obj = Formulario(root)
    root.mainloop()
Lo que quiero es llamar a las variables CampoTexto, M y F (de la función CreaGUI), u obtener su valor en la función Listener.

También me gustaría saber si estoy empleando de forma correcta el listener (no se si se le conozca de igual forma en Python). Mi método listener es:

Código:
def Listener(self):

        self.CreaGUI()

        Name = self.CampoTexto.get()
        Sex = 0

        if Sex == self.M.selection_get():

            print("Masculino")

        else:

            print("Femenino")

        print(Name, ", ", Sex)
Y se lo quiero asignar a mi botón aceptar mediante ésta línea:
Código:
Aceptar = Button(self.Contenedor)
        Aceptar.configure(text = "Aceptar", command = self.Listener)
¿Así se asigna un listener?

Gracias de antemano.

Última edición por Chezzy; 02/03/2013 a las 16:44
  #2 (permalink)  
Antiguo 02/03/2013, 22:54
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Variables de una función en otra. Listeners

Primero te recomiendo aprender un poco sobre POO para poder trabajar un poco mas a gusto con interfaces gráficas.

Código Python:
Ver original
  1. # coding: utf-8
  2. from tkinter import *
  3. from tkinter.ttk import *
  4.  
  5. class Formulario(Frame):
  6.  
  7.     def __init__(self, Contenedor):
  8.  
  9.         Frame.__init__(self, Contenedor)
  10.  
  11.         self.Contenedor = Contenedor
  12.  
  13.         self.CreaGUI()
  14.  
  15.     def CreaGUI(self):
  16.  
  17.         self.Contenedor.title("Formulario de Inscripción")
  18.         self.style = Style()
  19.         self.style.theme_use("default")
  20.  
  21.         Nombre = Label(self.Contenedor, text = "Nombre: ").grid(row = 0, sticky = W)
  22.         self.CampoTexto = Entry(self.Contenedor, width = 40)
  23.         self.CampoTexto.grid(row = 0, column = 1)
  24.  
  25.         self.X = IntVar()
  26.         Sexo = Label(self.Contenedor, text = "Sexo: ").grid(row = 1, pady = 30, sticky = W)
  27.         self.M = Radiobutton(self.Contenedor, text = "M", variable = self.X, value = 1)
  28.         self.M.grid(row = 1, column = 1, sticky = W)
  29.         self.F = Radiobutton(self.Contenedor, text = "F", variable = self.X, value = 2)
  30.         self.F.grid(row = 1, column = 1, sticky = W, padx = 50)
  31.  
  32.         Aceptar = Button(self.Contenedor)
  33.         Aceptar.configure(text = "Aceptar", command = self.Listener)
  34.         Aceptar.grid(row = 2, column = 1)
  35.  
  36.     def Listener(self):
  37.  
  38.         Name = self.CampoTexto.get()
  39.         print(Name)
  40.         sex = self.X.get()
  41.         if sex == 1:
  42.             print(Name, "Masculino")
  43.         elif sex == 2:
  44.             print(Name, "Femenino")
  45.         else:
  46.             print(Name, "Sexo no seleccionado")
  47.         print(self.X.get())
  48.  
  49.  
  50.  
  51.  
  52. if __name__ == '__main__':
  53.  
  54.     root = Tk()
  55.     root.geometry("340x150")
  56.  
  57.     obj = Formulario(root)
  58.     root.mainloop()
Supongo que esto es lo quieres hacer.

Aclaraciones: Estas usando python 3 y tkinteger para python 3
  #3 (permalink)  
Antiguo 03/03/2013, 14:03
Avatar de Chezzy  
Fecha de Ingreso: marzo-2013
Ubicación: Mérida, Yucatán, México
Mensajes: 2
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Variables de una función en otra. Listeners

Muchas gracias, sí, eso era precísamente lo que necesitaba. Yo pensaba que sólo debía agregársele "self." cuando se declaraban variables dentro del constructor.

Por cierto, ya llevé POO con Java, pero no encontraba la manera de cómo hacerlo aquí, pues en java puedes declarar variables globales sin asignarles valor (ej. JButton Aceptar; ), y en Python se le tiene que dar a fuerza un valor, pero si les asignaba 0 me decía que eran tipos de datos incompatibles.

Gracias.
  #4 (permalink)  
Antiguo 03/03/2013, 23:57
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Variables de una función en otra. Listeners

Cita:
Iniciado por Chezzy Ver Mensaje
Por cierto, ya llevé POO con Java, pero no encontraba la manera de cómo hacerlo aquí, pues en java puedes declarar variables globales sin asignarles valor (ej. JButton Aceptar; )
No del todo cierto, en Java si esa variable es un miembro de clase entonces por default le asigna el valor de null. En cambio si es una variable local dentro de un método entonces si no le asigna null, pero si lo tratas de usar y no le haz asignado ningún valor antes entonces el compilador te lanza un error. Así que de todas formas, ya sea de manera explicita o implícita en java también tienes que asignarle un valor a tus variables antes de usarlas.

Etiquetas: python3
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:23.