Foros del Web » Programando para Internet » Python »

Destruir ventana desde otro modulo en wxpython

Estas en el tema de Destruir ventana desde otro modulo en wxpython en el foro de Python en Foros del Web. Saludos, tengo una aplicación wx.python distribuida en distintos módulos... MyFrame1.py MyFrame2.py MyFrame3.py.... y MyApp que es el que contiene la clase MyApp de donde ejectuto ...
  #1 (permalink)  
Antiguo 15/07/2011, 23:04
 
Fecha de Ingreso: julio-2011
Mensajes: 10
Antigüedad: 13 años, 4 meses
Puntos: 2
Destruir ventana desde otro modulo en wxpython

Saludos, tengo una aplicación wx.python distribuida en distintos módulos...
MyFrame1.py
MyFrame2.py
MyFrame3.py....
y MyApp que es el que contiene la clase MyApp de donde ejectuto mi aplicacion.

Bueno resulta que no se como cerrar la venana desde otro modulo, me explico:

La clase MyApp del modulo MyApp.py, abre el Frame1.
El Frame1 abre el Frame2. pero ¿Que sucede? necesito cerrar el Frame1 despues de abrir el Frame2 y no puedo. Intente instanciar una variable (MyFrame = MyFrame1(None, -1, '') para poder cerrarla con MyFrame.Destroy() pero la ventana sigue hay sin cerrarse, entiendo perfectamente lo que sucede, pues es que he creado una instancia diferente a la que ya estaba en ejecución. Pero no tengo idea de como resolverlo. Gracias.
  #2 (permalink)  
Antiguo 15/07/2011, 23:29
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: Destruir ventana desde otro modulo en wxpython

Entonces quieres crear una instancia de Frame2 en Frame1 y luego cerrar Frame1.

Algo mas o menos así.

Código Python:
Ver original
  1. import wx
  2.  
  3. class MyFrame1(wx.Frame):
  4.     def __init__(self):
  5.         wx.Frame.__init__(self, None, -1, "Frame1")
  6.         button = wx.Button(self, -1, "Frame2")
  7.        
  8.         button.Bind(wx.EVT_BUTTON, self.OnClick)
  9.         self.Bind(wx.EVT_MENU, self.OnExit)
  10.  
  11.     def OnClick(self,evt):
  12.         frame2 = MyFrame2()
  13.         frame2.Show()
  14.         self.Close()
  15.    
  16.     def OnExit(self, evt):
  17.         self.Close(True)
  18.  
  19. class MyFrame2(wx.Frame):
  20.     def __init__(self):
  21.         wx.Frame.__init__(self, None, -1, "Frame2")
  22.        
  23.     def OnExit(self, evt):
  24.         self.Close(True)
  25.  
  26. app = wx.PySimpleApp()
  27. frame1 = MyFrame1()
  28. frame1.Show()
  29.  
  30. app.MainLoop()
  #3 (permalink)  
Antiguo 16/07/2011, 15:24
 
Fecha de Ingreso: julio-2011
Mensajes: 10
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Destruir ventana desde otro modulo en wxpython

Resuelto! Gracias por la rapida respuesta. La clave estubo en el self.Close() de la linea 14.
Pero resulta que lo que intento hacer es algo

Tengo dos modulos:
frame1.py y frame2.py
necesito hacer todo el proceso anterior indicado pero, que el frame1 se cierre cuando pulse su boton.


frame1.py

import wx

class MyFrame1(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "Frame1")
button = wx.Button(self, -1, "Frame2")

button.Bind(wx.EVT_BUTTON, self.OnClick)
self.Bind(wx.EVT_MENU, self.OnExit)

def OnClick(self,evt):
#importar la clase MyFrame2 del modulo frame2.py
from frame2 import MyFrame2
frame2 = MyFrame2()
frame2.Show()



def OnExit(self, evt):
self.Close(True)



app = wx.PySimpleApp()
frame1 = MyFrame1()
frame1.Show()

app.MainLoop()


frame2.py


import wx

class MyFrame2(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "Frame2")
#Cerrar la ventana MyFrame1
from frame1 import MyFrame1
frame1 = MyFrame1()
MyFrame1.Destroy()



def OnExit(self, evt):
self.Close(True)




Como puedo hacerlo?
  #4 (permalink)  
Antiguo 16/07/2011, 16:06
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: Destruir ventana desde otro modulo en wxpython

Básicamente haces lo mismo que en el ejemplo que te mande.

Código Python:
Ver original
  1. #Frame1.py
  2. import wx
  3.  
  4. class MyFrame1(wx.Frame):
  5.     def __init__(self):
  6.         wx.Frame.__init__(self, None, -1, "Frame1")
  7.         button = wx.Button(self, -1, "Frame2")
  8.  
  9.         button.Bind(wx.EVT_BUTTON, self.OnClick)
  10.         self.Bind(wx.EVT_MENU, self.OnExit)
  11.  
  12.     def OnClick(self,evt):
  13.         #importar la clase MyFrame2 del modulo frame2.py
  14.         from frame2 import MyFrame2
  15.         frame2 = MyFrame2()
  16.         frame2.Show()
  17.         self.Close(True)
  18.  
  19.  
  20.     def OnExit(self, evt):
  21.         self.Close(True)
  22.  
  23. app = wx.PySimpleApp()
  24. frame1 = MyFrame1()
  25. frame1.Show()
  26.  
  27. app.MainLoop()

Código Python:
Ver original
  1. #Frame2.py
  2. import wx
  3.  
  4. class MyFrame2(wx.Frame):
  5.     def __init__(self):
  6.         wx.Frame.__init__(self, None, -1, "Frame2")
  7.  
  8.         def OnExit(self, evt):
  9.             self.Close(True)

Por cierto un modulo puede tener mas de una clase. Incluso en java también puedes tener mas de una clase en un solo archivo.
  #5 (permalink)  
Antiguo 16/07/2011, 22:37
 
Fecha de Ingreso: julio-2011
Mensajes: 10
Antigüedad: 13 años, 4 meses
Puntos: 2
Pregunta Respuesta: Destruir ventana desde otro modulo en wxpython

Ok he comprendio y me resulto muy útil gracias razpeita, pero! tengo otro problemita si serias tan amable de sacarme de este lio o duda.
¿Como puedo acceder a las variables de otro modulo, con el valor que tengan actualmente? Me explico:

en el Frame1 tengo una variable llamada mivariable con un valor False.
mivariable = False

en el mismo frame1, el valor de la variable cambia de False a True.
mivariable = True

Entonces desde el frame2 importo la variable, y no puedo lograr hacer que la variable se importe con el valor que se le ha asignado en frame1 en tiempo de ejcucion.

¿Que debo hacer al respecto?

Y gracias por el tiempo y tu atención. y respecto a tener mas de una clase, si es posible, pero resulta que estoy re-escribiendo un pequeño programa de inventario que hice, que tenia 7 clases, el programa tenia 3027 lineas de código, y no te imaginas la lucha que coji, un novato como yo, cada vez que encontraba un error, buscar me perdía.... entonces decidí dividirlo en módulos.

Última edición por wilmer_leyend; 16/07/2011 a las 22:46
  #6 (permalink)  
Antiguo 19/07/2011, 23:54
 
Fecha de Ingreso: julio-2011
Mensajes: 10
Antigüedad: 13 años, 4 meses
Puntos: 2
De acuerdo Respuesta: Destruir ventana desde otro modulo en wxpython

Ok. creo que lo que lo intento hacer es imposible en python (en C y C++ si, por medio de punteros). Ahora si existe una forma de poder hacerlo en python y es por medio de una función en el frame2 que no haga otra cosa mas que cambiar el valor indicado como parámetro a la variable mivariable. De forma que cada vez que intente cambiarle el valor a frame2.mivariable, solo tengo que llamar a la funcion

frame2.cambiarvalor("valor_a_cambiar")
  #7 (permalink)  
Antiguo 20/07/2011, 10:14
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: Destruir ventana desde otro modulo en wxpython

Creo que necesitas una buena lectura de programación orientada a objetos.
Por que al parecer estas confundiendo lo que son clases, lo que son objetos y lo que son modulos.

Si sabes ingles te recomiendo leer dive into python la sección de programación orientada a objetos. Si no sabes ingles te recomiendo leer python para todos la sección de programación orientada a objetos. (En cualquiera de los casos te recomiendo que leas ambos para que tengas una idea mas clara de que esta pasando cuando usas clases).

Etiquetas: modulo, wxpython
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 15:02.