Почему этот графический интерфейс wxPython зависает, когда вместо self.Close () используется self.Destroy ()? (пример прилагается)

LoginDialog открывается сself.loginButtonи после закрытия GUI зависает; кнопка входа в систему остается нажатой, и при попытке щелкнуть что-либо есть только звуковые сигналы.

LoginDialog() был из этогоруководство, просто дополнен строкой записи файла вonLogin (который не является источником проблемы). Похоже, что все работает при переключении с self.Destroy () на self.Close ().

Версия wxPython 3.0, Python 2.7.10

Следующий код является рабочим примером проблемы:

import wx

# wxGlade dependency
import gettext

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        wx.Frame.__init__(self, *args, **kwds)

        self.updateLoginButton = wx.Button(self, wx.ID_ANY, _("Store/Update Login"))

        self.Bind(wx.EVT_BUTTON, self.updateLogin, self.updateLoginButton)

        self.__set_properties()
        self.__do_layout()

    def __set_properties(self):
        self.SetTitle(_("Dialog Test"))

    def __do_layout(self):
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_1 = wx.FlexGridSizer(3, 1, 1, 0)

        exportButtons_sizer = wx.FlexGridSizer(1, 1, 1, 10)
        exportButtons_sizer.Add(self.updateLoginButton, 0, wx.TOP | wx.ALIGN_CENTER, 15)

        grid_sizer_1.Add(exportButtons_sizer, 0, wx.TOP | wx.ALIGN_CENTER, 20)

        sizer_1.Add(grid_sizer_1, 1, wx.ALL | wx.EXPAND, 15)

        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()

    def updateLogin(self, event):
        dlg = LoginDialog(self, -1)
        dlg.ShowModal()

class MyApp(wx.App):
    def OnInit(self):
        frame_1 = MyFrame(None, wx.ID_ANY, "")
        self.SetTopWindow(frame_1)
        frame_1.Show()
        return True

class LoginDialog(wx.Dialog):
    """
    Class to define login dialog
    """

    # ----------------------------------------------------------------------
    def __init__(self, parent, id, title="Update Login Info"):
        """Constructor"""
        wx.Dialog.__init__(self, parent, id, title)

        # user info
        user_sizer = wx.BoxSizer(wx.HORIZONTAL)

        user_lbl = wx.StaticText(self, label="Username:")
        user_sizer.Add(user_lbl, 0, wx.ALL | wx.CENTER, 5)
        self.user = wx.TextCtrl(self)
        user_sizer.Add(self.user, 0, wx.ALL, 5)

        # pass info
        p_sizer = wx.BoxSizer(wx.HORIZONTAL)

        p_lbl = wx.StaticText(self, label="Password:")
        p_sizer.Add(p_lbl, 0, wx.ALL | wx.CENTER, 5)
        self.password = wx.TextCtrl(self, style=wx.TE_PASSWORD | wx.TE_PROCESS_ENTER)
        p_sizer.Add(self.password, 0, wx.ALL, 5)

        main_sizer = wx.BoxSizer(wx.VERTICAL)
        main_sizer.Add(user_sizer, 0, wx.ALL, 5)
        main_sizer.Add(p_sizer, 0, wx.ALL, 5)

        btn = wx.Button(self, label="OK")
        btn.Bind(wx.EVT_BUTTON, self.onLogin)
        main_sizer.Add(btn, 0, wx.ALL | wx.CENTER, 5)

        self.SetSizer(main_sizer)

        self.__set_properties()

    # ----------------------------------------------------------------------
    def onLogin(self, event):
        """
        Check credentials and login
        """
        password = self.password.GetValue()
        email = self.user.GetValue()

        with open('login.txt', 'w') as f:
            f.write(email + ', ' + password)

        self.Destroy()

    def __set_properties(self):
        self.user.SetMinSize((220, 20))


if __name__ == "__main__":
    gettext.install("app")

    app = MyApp(0)
    app.MainLoop()

Ответы на вопрос(1)

Ваш ответ на вопрос