2016-12-11 7 views
0

LoginDialog открыт с self.loginButton, а после его закрытия графический интерфейс замерзает; кнопка входа в систему остается нажатой, и при попытке щелкнуть по чему-либо есть только звуковые сигналы.Почему этот wxPython GUI замерзает, когда self.Destroy() используется вместо self.Close()? (пример прилагается)

LoginDialog() был из этого tutorial, просто дополнен линией записи файлов в 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

Честно говоря, ваши коды запускаются прямо на моей стороне, 'python 2.7.3' и' wxpython 3.0.2' на windows 7 64bit – Shane

+1

Замораживание gui's до длинного кода, блокирующего главный экран gui. Запись в файл должна блокироваться. – Yoriz

+1

добавить некоторые операторы печати, чтобы увидеть, где ваш код зависает – user2682863

ответ

1

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