我有一个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程序,其他程序关闭
答案 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,但我真的没有看到另一种方式。如果其他人有更好的决议,请发布。