python - wxPython lukker ikke ramme med en forælder, der er et vindueshåndtag

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et program i Python, der får et vindueshåndtag via COM fra et andet program (tænk på Python-programmet som en addin) Jeg sætter dette vindue til at være den primære Python-rammeforælder, så at hvis det andet program minimerer pythonrammen vil også. Problemet er, når jeg går for at afslutte, og forsøger at lukke eller ødelægge hovedrammen, rammer rammen aldrig. Det er aldrig færdig med sin eksekvering (selv om den forsvinder), og det andet program nægter at lukke, medmindre det er dræbt med TaskManager.


Her er omtrent de trin, vi tager:


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


Nogen har nogen tanker om dette eller erfaring med denne slags ting?


Jeg sætter pris på enhver hjælp med dette!


[[Redigere]]
Dette er kun tilfældet, når jeg bruger håndtaget som forælder, hvis jeg bare får håndtaget og lukker python-programmet, lukker det andet program fint

Bedste reference


Jeg spekulerer på, om dit Close opkald kan hænge i close-handleren. Har du prøvet at ringe Destroy i stedet? Hvis det ikke hjælper, synes den eneste løsning at være 'reparere' eller 'løsne' din ramme - jeg kan ikke se en måde at gøre det på wx, men måske kan du falde ned til win32 API til den ene opgave ...?

Andre referencer 1


Hvis reparenting er alt hvad du behøver, kan du prøve frame.Reparent(None) før frame.Close()

Andre referencer 2


Min beslutning herom er lidt hacket, og ganske vist ikke den mest elegante løsning, jeg nogensinde har oplevet - men det virker ret effektivt ...


Grundlæggende er mine trin at starte en tråd, der afstemninger for at se om vindueshåndtaget er eksistent eller ej. Selvom det stadig eksisterer, skal du ikke gøre noget. Hvis det ikke længere eksisterer, skal du dræbe python-applikationen, så håndtaget (og hovedapplikationen) frigives.


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


Igen føles det lidt hackish, men jeg ser virkelig ikke en anden vej rundt om det. Hvis nogen andre har bedre beslutninger, så send venligst.