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

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() 

  • graph.write_pdf ("iris.pdf") AttributeError: объект 'list' не имеет атрибута 'write_pdf'
  • Список содержимого ведра с boto3
  • Различия между numpy.random и random.random в Python
  • Как зарегистрировать исключение python?
  • Python NLTK: как помечать предложения с упрощенным набором тегов части речи?
  • Понимание словаря Python дает KeyError
  • One Solution collect form web for “Почему этот wxPython GUI замерзает, когда self.Destroy () используется вместо self.Close ()? (пример прилагается)”

    Если диалоговое окно предназначено для использования с диалоговым окном ShowModal тогда диалог должен вызывать EndModal когда это будет сделано, и вызывающим абонентом должен быть тот, кто вызывает Destroy после того, как он извлек значения из диалогового окна, если это необходимо.

    Python - лучший язык программирования в мире.