wxPython не закроет Frame с родителем, который является дескриптором окна - PullRequest
1 голос
/ 02 июня 2009

У меня есть программа на Python, которая получает дескриптор окна через COM из другой программы (представьте, что программа Python является надстройкой). Я установил это окно как родительский элемент основного фрейма Python, чтобы, если другая программа свернула, Python кадр тоже будет. Проблема в том, что когда я иду к выходу и пытаюсь закрыть или уничтожить основной фрейм, frame.close никогда не завершает своего выполнения (хотя и исчезает), а другая программа отказывается закрываться, если не будет уничтожена с помощью TaskManager.

Вот примерно шаги, которые мы предпринимаем:

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

У кого-нибудь есть мысли по этому поводу или опыт с подобными вещами?

Я ценю любую помощь с этим!

[Изменить] Это только тот случай, когда я использую дескриптор в качестве родителя, если я просто получаю дескриптор и закрываю программу python, другая программа закрывается нормально

Ответы [ 3 ]

1 голос
/ 03 июня 2009

Интересно, может ли ваш Close звонок зависать в обработчике. Вы пытались звонить Destroy вместо этого? Если это не поможет, то, похоже, единственным решением будет «переопределение» или «отделение» вашего фрейма - я не вижу способа сделать это в wx, но, возможно, вы могли бы перейти на win32 API для этого одного задания ...?

0 голосов
/ 11 ноября 2009

Мое решение немного взломано, и, по общему признанию, не самое элегантное решение, которое я когда-либо придумывал, - но оно работает довольно эффективно ...

В основном мои шаги состоят в том, чтобы запустить поток, который опрашивает, чтобы увидеть, существует ли дескриптор окна или нет. Пока он еще существует, ничего не делай. Если оно больше не существует, убейте приложение python, позволяя освободить дескриптор (и основное приложение).

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

Опять же, это кажется немного хакерским, но я действительно не вижу другого способа обойти это. Если у кого-то еще есть лучшие решения, пожалуйста, напишите.

0 голосов
/ 05 июня 2009

Если вам нужно переучить, вы можете попробовать frame.Reparent(None) до frame.Close()

...