wxPython不会closures与父窗口句柄的框架

我有一个Python程序,从另一个程序通过COM获取窗口句柄(把Python程序看作是一个插件)我把这个窗口设置为主Python框架的父窗口,所以如果另一个程序最小化,python框架也会。 问题是,当我退出,并尝试closures或销毁主框架,frame.close永远不会完成它的执行(虽然它消失),另一个程序拒绝closures,除非杀死与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 

有人对此有什么想法或者有这方面的经验吗?

我感谢任何帮助!

[编辑]这只是当我使用句柄作为父母的情况下,如果我刚刚得到句柄,closurespython程序,另一个程序closures罚款

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

如果重新设置是你所需要的,你可以在frame.Close()之前尝试frame.Reparent(None) frame.Close()

我对这个问题的解决方法有点被黑客攻击,而且不是我曾经提出过的最优雅的解决方案 – 但它的工作效率相当高。

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

再一次,这感觉有点骇人听闻,但我真的没有看到另一种方式。 如果有其他人有更好的决议,请张贴。