wxPython no cerrará Capítulo con un padre que es un identificador de ventana
Pregunta
Tengo un programa en Python que recibe un identificador de ventana a través de COM de otro programa (pensar en el programa de Python como un complemento) configurar esta ventana para ser el padre de la estructura principal del pitón de modo que si el otro programa minimiza, la pitón marco también lo hará. El problema es cuando voy a salir y tratar de cerrar o destruir el marco principal, el frame.close no completa su ejecución (aunque no desaparece) y el otro programa se niega a cerrar a menos que mató con administrador de tareas.
Estos son más o menos los pasos que tomamos:
if we are started directly, launch other program
if not, we are called from the other program, do nothing
enter main function:
create new wx.App
set other program as frame parent:
Get handle via COM
create a parent using wx.Window_FromHWND
create new frame with handle as parent
show frame
enter main loop
App.onexit:
close frame
frame = None
handle as parent = None
handle = None
¿Alguien tiene alguna idea sobre esto o experiencia con este tipo de cosas?
Agradezco cualquier ayuda con esto!
[Editar] Este es sólo el caso cuando se utiliza el mango como padre, si acabo de recibir el mango y cerrar el programa pitón, el otro programa se cierra bien
Solución 3
Mi solución a este es un poco hackeado, y es cierto que no es la solución más elegante que he llegado con - pero funciona bien con eficacia ...
Básicamente mis pasos son para iniciar un hilo que las encuestas para ver si el identificador de ventana es inexistente o no. Aunque aún es inexistente, no hacer nada. Si ya no existe, matar a la aplicación de pitón, permitiendo que el mango (y la aplicación principal) para ser lanzado.
class CheckingThread(threading.Thread):
'''
This class runs a check on Parent Window to see if it still is running
If Parent Window closes, this class kills the Python Window application in memory
'''
def run(self):
'''
Checks Parent Window in 5 seconds intervals to make sure it is still alive.
If not alive, exit application
'''
self.needKill = False
while not self.needKill:
if self.handle is not None:
if not win32gui.IsWindow(self.handle):
os._exit(0)
break
time.sleep(5)
def Kill(self):
'''
Call from Python Window main application that causes application to exit
'''
self.needKill = True
def SetHandle(self, handle):
'''
Sets Handle so thread can check if handle exists.
This must be called before thread is started.
'''
self.handle = handle
Una vez más, se siente un poco hacker, pero yo no veo otra manera alrededor de ella. Si nadie tiene mejores resoluciones, por favor puesto.
Otros consejos
Me pregunto si su llamada Close
puede ser colgado en el primer controlador. ¿Ha intentado llamar Destroy
en su lugar? Si esto no funciona, entonces la única solución parece ser "reparentalización" o "separar" su marco - No veo una manera de hacer eso en wx
, pero tal vez usted podría bajar a la API de Win32 para que una tarea ...?
Si reparentalización es todo lo que necesita, puede intentar frame.Reparent(None)
antes frame.Close()