Frage

Ich habe ein Programm in Python, die einen Fenstergriff über COM aus einem anderen Programm (man denke an die Python-Programm als Addin) bekomme ich dieses Fenster legen Sie die wichtigsten Python Rahmen der Eltern zu sein, so dass, wenn das andere Programm minimiert, die Python Rahmen wird auch. Das Problem ist, wenn ich verlassen zu gehen, und versuchen, den Hauptrahmen zu schließen oder zu zerstören, die frame.close nie abgeschlossen er die Ausführung ist (obwohl es nicht verschwindet) und das andere Programm weigert sich, mit Taskmanager, es sei denn, getötet zu schließen.

Hier sind etwa die Schritte, die wir nehmen:

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

Jeder irgendwelche Gedanken zu diesem oder Erfahrung mit dieser Art der Sache?

Ich schätze jede Hilfe bei diesem!

[Bearbeiten] Dies ist nur dann der Fall, wenn ich den Griff als Eltern verwenden, wenn ich den Griff gerade bekommen und das Python-Programm schließen, das andere Programm schließt fein

War es hilfreich?

Lösung 3

Meine Auflösung ist dies ein wenig gehackt, und zwar nicht die eleganteste Lösung, die ich je habe kommen mit - aber es funktioniert ziemlich effektiv ...

Im Grunde meine Schritte sind einen Thread zu starten, dass Umfragen, um zu sehen, ob der Fenstergriff ist vorhanden oder nicht. Es ist zwar noch vorhanden ist, nichts tun. Wenn es nicht mehr existiert, tötet die Python-Anwendung, so dass der Griff (und Hauptanwendung) freigegeben werden.

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

Auch hier fühlt es sich ein wenig hackish, aber ich sehe nicht wirklich einen anderen Weg drum herum. Wenn jemand anderes besser Auflösungen hat, bitte posten.

Andere Tipps

Ich frage mich, ob Ihr Close Anruf in der Nähe Handler hängen werden. Haben Sie Destroy stattdessen versucht, ruft an? Wenn das nicht hilft, dann wäre die einzige Lösung scheint „Neuzuordnung“ oder „Abnehmen“ Ihren Rahmen zu sein - ich weiß nicht, einen Weg sehen, dass in wx zu tun, aber vielleicht könnten Sie fallen bis auf win32 API für die eine Aufgabe ...?

Wenn Neuzuordnung ist alles, was Sie benötigen, können Sie frame.Reparent(None) vor frame.Close() versuchen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top