2014-10-28 3 views
0

나는 python과 wxpython을 사용하여 새로운 버전입니다. 주 프레임 시작 후 로그인 양식 대화 상자를 표시하는 데 문제가 있습니다. this picture메인 프레임 시작시 Wxpython show 대화 상자

사용자가 로그인하지 않으면 기본 프레임에 액세스 할 수 없습니다. 사용자가 close/tutup 버튼을 클릭하면 메인 프레임도 닫힙니다. 나에게 샘플 코드를주세요 :

답변

1
import wx 
from wx.lib import sized_controls 


class MainFrame(sized_controls.SizedFrame): 

    def __init__(self, *args, **kwargs): 
     super(MainFrame, self).__init__(*args, **kwargs) 
     self.SetTitle('MainFrame') 
     pane = self.GetContentsPane() 
     wx.Button(pane, label='No access until logged in') 
     self.SetInitialSize((400, 400)) 


class LoginFrame(sized_controls.SizedDialog): 

    def __init__(self, *args, **kwargs): 
     super(LoginFrame, self).__init__(*args, **kwargs) 
     self.parent = args[0] 
     self.logged_in = False 

     pane = self.GetContentsPane() 

     pane_form = sized_controls.SizedPanel(pane) 
     pane_form.SetSizerType('form') 

     label = wx.StaticText(pane_form, label='User Name') 
     label.SetSizerProps(halign='right', valign='center') 

     self.user_name_ctrl = wx.TextCtrl(pane_form, size=((200, -1))) 

     label = wx.StaticText(pane_form, label='Password') 
     label.SetSizerProps(halign='right', valign='center') 

     self.password_ctrl = wx.TextCtrl(
      pane_form, size=((200, -1)), style=wx.TE_PASSWORD) 

     pane_btns = sized_controls.SizedPanel(pane) 
     pane_btns.SetSizerType('horizontal') 
     pane_btns.SetSizerProps(halign='right') 

     login_btn = wx.Button(pane_btns, label='Login') 
     login_btn.SetDefault() 
     cancel_btn = wx.Button(pane_btns, label='Cancel') 
     self.Fit() 
     self.SetTitle('Login') 
     self.CenterOnParent() 
     self.parent.Disable() 

     login_btn.Bind(wx.EVT_BUTTON, self.on_btn_login) 
     cancel_btn.Bind(wx.EVT_BUTTON, self.on_btn_cancel) 
     self.Bind(wx.EVT_CLOSE, self.on_close) 

    def on_btn_login(self, event): 
     user_name = self.user_name_ctrl.GetValue() 
     password = self.password_ctrl.GetValue() 
     print 'logged in as {} with password {}'.format(user_name, password) 
     self.logged_in = True 
     self.Close() 

    def on_btn_cancel(self, event): 
     self.Close() 

    def on_close(self, event): 
     if not self.logged_in: 
      self.parent.Close() 
     self.parent.Enable() 
     event.Skip() 


if __name__ == '__main__': 
    wxapp = wx.App(False) 
    parent_frame = MainFrame(None) 
    parent_frame.Show() 
    login_frame = LoginFrame(parent_frame) 
    login_frame.Show() 
    wxapp.MainLoop() 
+0

감사 Yoriz, 당신은 최고입니다 .. : D –

0

I wrote 올해 초. 여기에 도움이 될만한 예가 있습니다. 대화 상자에 프레임이 표시되지 않지만 변경하는 것은 간단합니다. 대신 로그인 대화 상자가 표시되고 사용자가 성공적으로 로그인하지 않으면 프레임이 표시되지 않습니다.

import wx 

if "2.8" in wx.version(): 
    import wx.lib.pubsub.setupkwargs 
    from wx.lib.pubsub import pub 
else: 
    from wx.lib.pubsub import pub 


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

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Dialog.__init__(self, None, title="Login") 

     # 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) 
     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="Login") 
     btn.Bind(wx.EVT_BUTTON, self.onLogin) 
     main_sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5) 

     cancel = wx.Button(self, wx.ID_CANCEL) 
     main_sizer.Add(cancel, 0, wx.ALL|wx.CENTER, 5) 

     self.SetSizer(main_sizer) 

    #---------------------------------------------------------------------- 
    def onLogin(self, event): 
     """ 
     Check credentials and login 
     """ 
     stupid_password = "pa$$w0rd!" 
     user_password = self.password.GetValue() 
     if user_password == stupid_password: 
      print "You are now logged in!" 
      pub.sendMessage("frameListener", message="show") 
      self.Destroy() 
     else: 
      print "Username or password is incorrect!" 

######################################################################## 
class MyPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 


######################################################################## 
class MainFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="Main App") 
     panel = MyPanel(self) 
     pub.subscribe(self.myListener, "frameListener") 

     # Ask user to login 
     dlg = LoginDialog() 
     res = dlg.ShowModal() 
     if res == wx.ID_CANCEL: 
      dlg.Destroy() 
      self.Close() 


    #---------------------------------------------------------------------- 
    def myListener(self, message, arg2=None): 
     """ 
     Show the frame 
     """ 
     self.Show() 


if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MainFrame() 
    app.MainLoop() 
+0

감사 마이크 드리스콜 .. :) –

관련 문제