wxPython non chiuderà Telaio con un genitore che è un handle di finestra
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
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()