Foros del Web » Programando para Internet » Python »

Que un módulo ejecute otro, y ese ejecute el primero sucesivamente

Estas en el tema de Que un módulo ejecute otro, y ese ejecute el primero sucesivamente en el foro de Python en Foros del Web. Hola. No sé si fue claro el título... Intentaré explicarlo... Esto tiene que ser muy fácil de resolver, pero como soy tan novato, no tengo ...
  #1 (permalink)  
Antiguo 03/12/2011, 11:15
Avatar de saulortega  
Fecha de Ingreso: septiembre-2011
Ubicación: Bogotá
Mensajes: 79
Antigüedad: 13 años, 3 meses
Puntos: 0
Que un módulo ejecute otro, y ese ejecute el primero sucesivamente

Hola.

No sé si fue claro el título... Intentaré explicarlo... Esto tiene que ser muy fácil de resolver, pero como soy tan novato, no tengo idea...


Módulo uno:
Código Python:
Ver original
  1. import Tkinter as tk
  2.  
  3. ventana = tk.Tk()
  4.  
  5. def destruir():
  6.     ventana.destroy()
  7.     import dos
  8.  
  9. boton = tk.Button(ventana, text="Iniciar", width=10, command=destruir)
  10. boton.pack()
  11.  
  12. ventana.mainloop()


Módulo dos:
Código Python:
Ver original
  1. from Tkinter import *
  2.  
  3. finalizar = Tk()
  4.  
  5. def bloquear():
  6.     finalizar.destroy()
  7.     import uno
  8.  
  9. boton = Button(finalizar, text="Finalizar", width=15, command=bloquear )
  10. boton.pack()
  11.  
  12. finalizar.mainloop()


Esto es lo que pasa: Ejecuto el módulo uno, pulso el botón, se destruye, y se ejecuta el módulo dos. Ahora en el módulo dos pulso el botón, se destruye, y se ejecuta el módulo uno. Ahora en el módulo uno de nuevo pulso el botón, se destruye, y no se ejecuta el módulo dos.

Así que, ¿qué hay que hacer para que un módulo invoque a otro indefinidamente?
  #2 (permalink)  
Antiguo 03/12/2011, 11:46
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: Que un módulo ejecute otro, y ese ejecute el primero sucesivamente

  1. Esa no es la manera de usar los módulos
  2. Es peligroso hacer llamadas indefinidas
  3. Vas contra el modelo de programación de interfaces gráficas
Si quieres manejar ventanas hijo entonces te dejo un código de ejemplo.

Código Python:
Ver original
  1. import Tkinter as tk
  2.  
  3. def ventana1():
  4.  
  5.     def onClick():
  6.         print "Iniciar"
  7.         ventana2()
  8.  
  9.     root = tk.Tk()
  10.     boton = tk.Button(root, text="Iniciar", command=onClick)
  11.     boton.pack()
  12.     root.mainloop()
  13.  
  14. def ventana2():
  15.  
  16.     def onClick():
  17.         print "Finalizar"
  18.  
  19.     root = tk.Toplevel()
  20.     boton = tk.Button(root, text="Finalizar", command=onClick)
  21.     boton.pack()
  22.  
  23.  
  24. ventana1()
  #3 (permalink)  
Antiguo 03/12/2011, 12:26
Avatar de saulortega  
Fecha de Ingreso: septiembre-2011
Ubicación: Bogotá
Mensajes: 79
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Que un módulo ejecute otro, y ese ejecute el primero sucesivamente

Mmmm... Pero no respondió a mi pregunta...
  #4 (permalink)  
Antiguo 03/12/2011, 12:29
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: Que un módulo ejecute otro, y ese ejecute el primero sucesivamente

Mmmmm Pero no leíste mi respuesta.
  #5 (permalink)  
Antiguo 03/12/2011, 12:32
Avatar de saulortega  
Fecha de Ingreso: septiembre-2011
Ubicación: Bogotá
Mensajes: 79
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Que un módulo ejecute otro, y ese ejecute el primero sucesivamente

Cita:
Iniciado por razpeitia Ver Mensaje
Mmmmm Pero no leíste mi respuesta.
Sí, la leí, y te creo, no estoy siguiendo los estándares, y ejecuté tu ejemplo para probar... Y sigo sin saber cómo hacer lo que quiero...
  #6 (permalink)  
Antiguo 03/12/2011, 15:42
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: Que un módulo ejecute otro, y ese ejecute el primero sucesivamente

Bueno el concepto de ventanas es muy simple, existe la ventana principal, la que creas usando el metodo Tk(), si cierras esa ventana principal matas el proceso pero esta ventana principal puede tener ventanas hijo y esas ventanas hijo pueden tener a su vez ventanas hijos.

Si cierras la ventana principal (root) entonces se cierran las demás ventanas.

Solución:
Al iniciar la aplicación esconder la ventana principal y mantener el rastro de las ventanas que vayas abriendo, al cerrar cada ventana solo necesitas checar si no existe ninguna alguna ventana abierta, en caso que no tengas mas ventanas abiertas cierras la ventana principal y listo.
  #7 (permalink)  
Antiguo 05/12/2011, 14:00
Avatar de saulortega  
Fecha de Ingreso: septiembre-2011
Ubicación: Bogotá
Mensajes: 79
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Que un módulo ejecute otro, y ese ejecute el primero sucesivamente

Gracias. Bueno, entonces, siguiendo lo que dices, hice esto:


Código Python:
Ver original
  1. from Tkinter import *
  2.      
  3. principal = Tk()
  4.      
  5. def ventana1():
  6.     ventana1 = Tk()
  7.     boton1 = Button(ventana1, text="Iniciar ventana 2", width=15, command=ventana2)
  8.     boton1.pack()
  9.     ventana1.mainloop()
  10.  
  11. def ventana2():
  12.     ventana1.destroy()
  13.     ventana2 = Tk()
  14.     boton2 = Button(ventana2, text="Iniciar ventana 3", width=15, command=ventana3)
  15.     boton2.pack()
  16.     ventana2.mainloop()
  17.  
  18. def ventana3():
  19.     ventana2.destroy()
  20.     ventana3 = Tk()
  21.     boton3 = Button(ventana3, text="Iniciar ventana 2", width=15, command=ventana2)
  22.     boton3.pack()
  23.     ventana3.mainloop()
  24.      
  25. ventana1()
  26.      
  27. principal.mainloop()

Pero el comando ".destroy()" no funciona con esas ventanas "hijas". Me aparece esto:

Código:
AttributeError: 'function' object has no attribute 'destroy'
Y sí funciona con la ventana "madre"... ¿Por qué?



Ah, y otra cosa, ¿Cómo oculto la ventana principal?
  #8 (permalink)  
Antiguo 05/12/2011, 16:54
Avatar de saulortega  
Fecha de Ingreso: septiembre-2011
Ubicación: Bogotá
Mensajes: 79
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Que un módulo ejecute otro, y ese ejecute el primero sucesivamente

Bue, creo que ya encontré la manera de hacerlo.

No destruyendo las ventanas, sino ocultándolas y "desocultándolas" con .withdraw() y deiconify()... Voy a probar...
  #9 (permalink)  
Antiguo 05/12/2011, 17:59
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: Que un módulo ejecute otro, y ese ejecute el primero sucesivamente

Código Python:
Ver original
  1. from Tkinter import *
  2. NoDefaultRoot()
  3.  
  4. def createWindow():
  5.  
  6.     def handler():
  7.         createWindow()
  8.         win.destroy()
  9.  
  10.     win = Tk()
  11.     button = Button(win, text='Create and Destroy', command=handler)
  12.     button.pack()
  13.  
  14.     return win
  15.  
  16. win1 = createWindow()
  17. win1.mainloop()

Realmente no entiendo bien para que quieres hacer esto.

Etiquetas: primero
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 02:04.