Domanda

Ho un programma in Python che ottiene un handle di finestra tramite COM da un altro programma (si pensi al programma Python come un componente aggiuntivo) ho impostato questa finestra di essere padre del telaio Python principale in modo che se l'altro programma minimizza, il pitone telaio sarà troppo. Il problema è che quando vado per uscire, e provare a chiudere o distruggere la struttura principale, il frame.close mai completa è di esecuzione (anche se non scompare) e l'altro programma si rifiuta di chiudere se non ucciso con TaskManager.

Qui ci sono circa i passi che prendiamo:

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

Qualcuno ha qualche idea su questo o esperienza con questo genere di cose?

Apprezzo tutto l'aiuto con questo!

[Modifica] Questo è solo il caso quando uso il manico come un genitore, se ottengo solo la maniglia e chiudere il programma python, l'altro programma si chiude bene

È stato utile?

Soluzione 3

La mia soluzione a questo è un po 'violato, e certamente non la soluzione più elegante che io abbia mai venuta in mente - ma funziona in modo piuttosto efficace ...

In pratica i miei passi sono per avviare un thread che i sondaggi per vedere se l'handle di finestra è esistente oppure no. Mentre è ancora esistente, non fare nulla. Se non esiste, uccidere l'applicazione Python, permettendo l'impugnatura (e l'applicazione principale) per essere rilasciato.

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

Anche in questo caso, ci si sente un po 'hackish, ma io non vedo un altro modo intorno ad esso. Se qualcun altro ha migliori risoluzioni, si prega di inviare.

Altri suggerimenti

Mi chiedo se la chiamata Close può essere appeso in primo gestore. Hai provato a chiamare Destroy invece? Se questo non aiuta, quindi l'unica soluzione sembra essere "reparenting" o "distacco" cornice - Non vedo un modo per farlo in wx, ma forse si potrebbe scendere fino a win32 API per quel un compito ...?

Se reparenting è tutto ciò che serve, si può provare frame.Reparent(None) prima frame.Close()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top