Wxpython لن تغلق الإطار مع أحد الوالدين وهو مقبض النافذة

StackOverflow https://stackoverflow.com/questions/941470

سؤال

لدي برنامج في 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()

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top