Wxpython لن تغلق الإطار مع أحد الوالدين وهو مقبض النافذة
سؤال
لدي برنامج في Python الذي يحصل على مقبض نافذة عبر COM من برنامج آخر (فكر في برنامج Python كإضافة)، أقوم بتعيين هذا النافذة ليكون الأصل الرئيسي لإطار الثعبان بحيث إذا كان البرنامج الآخر يقلل، فإن إطار Python سوف أيضا وبعد المشكلة هي عندما أذهب إلى الخروج، وحاول إغلاق أو تدمير الإطار الرئيسي، فإن الإطار. لا يكمل الإطار. لا يكمل الإعدام أبدا (على الرغم من أنه يختفي) والبرنامج الآخر يرفض إغلاق ما لم يقتل مع المهام.
هنا هي تقريبا الخطوات التي نأخذها:
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
أي شخص لديه أي أفكار حول هذا أو التجربة مع هذا النوع من الشيء؟
أقدر أي مساعدة في هذا!
edit] هذا هو الحال فقط عندما أستخدم المقبض كوالد، إذا قمت فقط بالحصول على المقبض وإغلاق برنامج Python، فإن البرنامج الآخر يغلق بشكل جيد
المحلول 3
قراري هذا هو اختراق بعض الشيء، ولم يكن من المسلم به أن الأكثر أناقة الحل الذي وصلت إليه - لكنه يعمل بشكل فعال بشكل فعال ...
في الأساس خطواتي هي بدء موضوع استطلاعات الرأي لمعرفة ما إذا كان مقبض النافذة موجود أم لا. في حين أنه لا يزال موجودا، فلا تفعل شيئا. إذا لم تعد موجودة، فقتل تطبيق 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
مرة أخرى، تشعر بالقلصاء قليلا، لكنني لا أرى حقا طريقة أخرى حولها. إذا كان لدى أي شخص آخر قرارات أفضل، فيرجى النشر.
نصائح أخرى
وأتساءل عما إذا كان لديك Close
قد تكون المكالمة معلقة في المعالج القيب. هل حاولت الاتصال Destroy
في حين أن؟ إذا لم يساعد ذلك، فسيظهر الحل الوحيد "تجديد" أو "فصل" الإطار الخاص بك - لا أرى طريقة للقيام بذلك wx
, ، ولكن ربما يمكنك الانخفاض إلى Win32 API لهذه المهمة واحدة ...؟
إذا تم تجديده هو كل ما تحتاجه، فيمكنك أن تجرب frame.Reparent(None)
قبل frame.Close()