Foros del Web » Programando para Internet » Python »

Scoping

Estas en el tema de Scoping en el foro de Python en Foros del Web. Hola, bueno, el asunto es el siguiente.. Tengo un modulo donde defino una clase! Y en el archivo principal la instancio dentro de una variable.. ...
  #1 (permalink)  
Antiguo 30/12/2009, 19:37
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 5 meses
Puntos: 19
De acuerdo Scoping

Hola, bueno, el asunto es el siguiente..

Tengo un modulo donde defino una clase!

Y en el archivo principal la instancio dentro de una variable..

Luego me gustaria acceder a esa variable desde una funcion que esta definida en otro modulo de funciones!

Me tira error, si alguien sabe como solucionar esto le agradeceria

Saludos!
  #2 (permalink)  
Antiguo 30/12/2009, 20:50
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Scoping

y que error te tira?
Que intentas hacer con ese objeto?

Infiriendo por el titulo y sin mas datos, te podría recomendar el uso de global, pero mejor postea un pedazo de código para saber bien que intentas hacer.
  #3 (permalink)  
Antiguo 30/12/2009, 21:24
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 5 meses
Puntos: 19
Respuesta: Scoping

En un archivo Controller.py tengo esto

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. import gtk
  3. from gtk import glade
  4. import os
  5. import sys
  6.  
  7. class Controller:
  8.    
  9.     def __init__(self):        
  10.         #Cargo la ventana principal
  11.         self.ui = glade.XML("app.glade", None, None)
  12.        
  13.         self.setObjects()
  14.         self.connectAll()
  15.        
  16.     def start(self):
  17.         self.mainWindow.show()
  18.         gtk.main()
  19.        
  20.     def setObjects(self):
  21.         #Ventana principal
  22.         self.mainWindow = self.ui.get_widget("mainWindow")
  23.         self.loginWindow = self.ui.get_widget("loginWindow")
  24.         self.aboutWindow = self.ui.get_widget("aboutWindow")
  25.        
  26.     def connectAll(self):
  27.         self.ui.signal_connect("on_mainWindow_destroy", self.__on_mainWindow_destroy)
  28.         self.ui.signal_connect("on_mwMenuItemConnect_activate", self.__on_mwMenuItemConnect_activate)
  29.         self.ui.signal_connect("on_mwMenuItemAbout_activate", self.__on_mwMenuItemAbout_activate)
  30.  
  31.  
  32.     """ Events """
  33.    
  34.     def __on_mainWindow_destroy(self, *argv):
  35.         gtk.main_quit()
  36.         sys.exit()
  37.        
  38.     def __on_mwMenuItemAbout_activate(self, *argv):
  39.         self.aboutWindow.show()
  40.        
  41.     def __on_mwMenuItemConnect_activate(self, *argv):
  42.         self.loginWindow.show()


En otro Base.py tengo esto
Código Python:
Ver original
  1. #!/usr/bin/env python
  2. import Controller
  3.  
  4. if __name__ == "__main__":
  5.     app = Controller.Controller()
  6.     app.start()

Ahora bien!, yo desde otro modulo quiero acceder desde una funcion definida en ese modulo al objeto "app"

el archivo es functions.py y tiene definidas unas funciones de las cuales algunas queria que accedan a app
pero no lo he logrado!... me tira un error de

'module' object has not attribute 'app'

probe importando el archivo base.py como modulo
import base

pero me tiro otros errores mas jaja
  #4 (permalink)  
Antiguo 30/12/2009, 21:25
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 5 meses
Puntos: 19
Respuesta: Scoping

Aclaro que recien empiezo con python, empece ayer!
  #5 (permalink)  
Antiguo 30/12/2009, 22:28
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Scoping

Si quieres trabajar con app desde otra funcion, te recomendaría que lo pasaras como argumento de una función.

Por ejemplo:
Código Python:
Ver original
  1. #!/usr/bin/env python
  2. #Base.py
  3. import Controller
  4. import functions
  5.  
  6. if __name__ == "__main__":
  7.     app = Controller.Controller()
  8.     functions.f1(app)
  9.     functions.f2(app)
  10.     app.start()

Mientras que en tu modulo functions.py
Código Python:
Ver original
  1. #!/usr/bin/env python
  2. #functions.py
  3.  
  4. def functions.f1(app):
  5.     #Código misterioso
  6.  
  7. def functions.f2(app):
  8.     #Mas código misterioso
  #6 (permalink)  
Antiguo 31/12/2009, 09:31
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 5 meses
Puntos: 19
Respuesta: Scoping

Hola gracias por la respuesta, eso esta claro, pero, si quiero usar esas funciones para los signals de la UI?

por ejemplo, veras que en la class "app" tengo un metodo que asigna signals, bueno, mi idea es sacar los metodos privados, y transformarlos en funciones...

Una vez instanciada esa clase "app", que se asignen a cada signal la funcion correspondiente, el tema es que no puedo pasarle argumentos a las funciones asignadas ya que solo se pasa el nombre de la funcion

quisiera que me quede algo asi
Código Python:
Ver original
  1. self.ui.signal_connect("on_mwMenuItemAbout_activate", functions.f1)

en donde functions.f1, necesita hacer uso de app. dentro de si mismo


creo que estoy teniendo problemas con la organizacion del codigo, soy nuevo en esto como dije, a pesar de haber programado otros lenguajes como php, javascript, visual basic.net, se me esta complicando con el amigo python! jaja
  #7 (permalink)  
Antiguo 31/12/2009, 12:21
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Scoping

Claro que no es complicado.

Si lo único que querías hacer era eso, entonces importas functions en Controller.py para que puedas tener acceso a ese modulo.

Ahora si esa función lo vas a convertir en un evento no olvides el *agrv
Ejemplo:
def f1(*argv):

Claro que functions.f1 no deja de ser un evento. Lo que no logro entender es por que lo separas .-.
  #8 (permalink)  
Antiguo 31/12/2009, 12:46
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 5 meses
Puntos: 19
Respuesta: Scoping

estaba intentando organizar el codigo pero creo que lo complique mas! jajaj

Gracias por tu ayuda! :) (sos la unica persona en este foro que responde???)
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 06:00.