Pergunta

Eu tenho um programa em Python que recebe um identificador de janela via COM de outro programa (pense do programa Python como um suplemento) eu definir esta janela para ser pai do principal quadro Python para que, se os outros minimiza programa, o python quadro vai também. O problema é quando vou para sair, e tentar fechar ou destruir a estrutura principal, o frame.close nunca completa a sua execução (embora não desaparecer) e o outro programa se recusa a próxima menos que matou com TaskManager.

Aqui estão mais ou menos as medidas 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

Alguém tem alguma opinião sobre este ou experiência com esse tipo de coisa?

Agradeço qualquer ajuda com isso!

[Edit] Este é apenas o caso quando eu uso o punho como um pai, se eu apenas obter o identificador e feche o programa python, o outro programa fecha fina

Foi útil?

Solução 3

A minha solução para este é um pouco cortado, e reconhecidamente não é a solução mais elegante que eu já venha com - mas funciona bastante eficaz ...

Basicamente meus passos são para iniciar uma discussão que as pesquisas para ver se o identificador de janela é existente ou não. Enquanto ainda é inexistente, não fazer nada. Se ele não existir mais, matar a aplicação python, permitindo que a pega (e aplicação principal) para ser liberado.

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

Mais uma vez, ele se sente um pouco hackish, mas eu realmente não vejo outra maneira de contornar isso. Se ninguém tem melhores resoluções, por favor poste.

Outras dicas

Gostaria de saber se a sua chamada Close pode ser pendurado no close-manipulador. Você já tentou ligar Destroy em vez disso? Se isso não ajudar, então a única solução parece ser "reparenting" ou "separar" o frame - Eu não vejo uma maneira de fazer isso em wx, mas talvez você poderia cair para win32 API para que uma tarefa ...?

Se reparenting é tudo que você precisa, você pode tentar frame.Reparent(None) antes frame.Close()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top