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

¿Fue útil?

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()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top