wxPython不会与作为窗口句柄的父级关闭Frame

时间:2009-06-02 19:33:30

标签: python windows wxpython handle

我有一个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 个答案:

答案 0 :(得分:1)

我想知道你的Close电话是否可能挂在关闭处理程序中。您是否尝试过调用Destroy?如果这没有帮助,那么唯一的解决方案似乎是“重新”或“分离”你的框架 - 我在wx看不到这样做的方法,但也许你可以下降到这个任务的win32 API ......?

答案 1 :(得分:0)

如果您需要重新表达,可以在frame.Reparent(None)之前尝试frame.Close()

答案 2 :(得分:0)

我对此的解决方案有点被黑,而且无可否认,这不是我提出的最优雅的解决方案 - 但它的工作效率相当高......

基本上我的步骤是启动一个轮询以查看窗口句柄是否存在的线程。虽然它仍然存在,但什么都不做。如果它不再存在,请终止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

再一次,它感觉有点hackish,但我真的没有看到另一种方式。如果其他人有更好的决议,请发布。