2014-05-13 1 views
0

사용자 입력을 받아 입력이 올바른지 확인하는 텍스트 상자가 있습니다. 입력이 올바르지 않은 경우 사용자에게 입력 시도 횟수가 표시된 정보를 다시 입력하라는 대화 상자를 만들었습니다. 그러나 대화 상자는 카운트 다운을 계속하고 사용자가 데이터를 입력 할 수 없습니다.Python 루프에서 GUI 입력 양식 받기

def OnClick2(self,event): 
     password=self.enteredPass.GetValue() #takes the password form the textbox 
     user=self.enteredUser.GetValue() #takes the username form the textbox 
     count=0 # count for the number of tries 
     while (user!="Username" and password!="Password"): #loops untill it is right 
      dlg=wx.MessageDialog(self,"You have %s tries left"%(str(3-count)),"",wx.OK) 
      dlg.ShowModal() 
      dlg.Destroy() 
      count=count+1 
      password=self.enteredPass.GetValue() #retakes the password 
      user=self.enteredUser.GetValue() #retakes the username 
      if (count==3): 
       self.Destroy() 
       break 

사용자가 암호를 다시 입력 할 때까지 루프가 일시 중지되도록하려면 어떻게해야합니까?

+0

'if'내부에 'while'루프가있는 이유는 무엇입니까? – mauve

+0

if 문을 다시 고려 중이지만 while 루프는 입력 한 데이터가 잘못되었다는 대화 상자를 표시하고 남은 시도 수를 표시 할 수 있습니다. – user2883071

+0

왜 내가 그 이유를 알지 못한다고 말하고 있습니다. "if"부분이 존재합니다. – mauve

답변

1

루프는 사용자가 무언가를하도록하는 대신 메시지 대화 상자를 계속 반복 작성합니다. 루프를 제거하고 카운터를 이벤트 처리기 외부에 배치해야합니다. 다음은 실행 가능한 예제입니다.

import wx 

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

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="Test") 
     panel = wx.Panel(self) 
     self.count = 0 

     self.mainSizer = wx.BoxSizer(wx.VERTICAL) 

     usernameLbl = wx.StaticText(panel, label="Username:") 
     self.username = wx.TextCtrl(panel) 
     self.addWidgets(usernameLbl, self.username) 

     pwLbl = wx.StaticText(panel, label="Password:") 
     self.pw = wx.TextCtrl(panel) 
     self.addWidgets(pwLbl, self.pw) 

     btn = wx.Button(panel, label="Login") 
     btn.Bind(wx.EVT_BUTTON, self.onClick) 
     self.mainSizer.Add(btn, 0, wx.ALL|wx.CENTER, 5) 

     panel.SetSizer(self.mainSizer) 
     self.Show() 

    #---------------------------------------------------------------------- 
    def addWidgets(self, lbl, txt): 
     """""" 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     sizer.Add(lbl, 0, wx.ALL|wx.CENTER, 5) 
     sizer.Add(txt, 1, wx.ALL|wx.EXPAND, 5) 
     self.mainSizer.Add(sizer, 0, wx.ALL|wx.EXPAND) 

    #---------------------------------------------------------------------- 
    def onClick(self, event): 
     """""" 
     password = self.pw.GetValue() 
     user = self.username.GetValue() 

     if user!="Username" and password!="Password": 
      # count for the number of tries 
      msg = "You have %s tries left"%(str(3-self.count)) 
      dlg = wx.MessageDialog(self, msg, "", wx.OK) 
      dlg.ShowModal() 
      dlg.Destroy() 

      self.count += 1 
      password=self.pw.GetValue() #retakes the password 
      user=self.username.GetValue() #retakes the username 
      if self.count == 3: 
       self.Destroy() 


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

이것이 내가 원하는 바로 그 것이다. 코드를 단계별로 진행하려고하지만 길을 잃은 것처럼 보입니다. 사용자가 처음 로그인 버튼을 누르면 onClick이 호출됩니다. 클릭하면 사용자를 얻고 패스하고 확인합니다. 값이 정확하지 않으면 횟수를 표시 한 다음 카운터를 늘리 겠지만 사용자가 버튼을 다시 누를 때까지 기다리는 것을 어떻게 알 수 있습니까? GUI는 이벤트 중심이기 때문에 – user2883071

+1

. wxPython은 버튼을 클릭하는 것과 같이 "무언가"를하기를 기다립니다. 단추를 누를 때마다 이벤트 처리기가 실행되고 사용자 이름과 암호를 확인하고 대화 상자를 표시합니다. ** if 문 **을 다시 추가했습니다. 사용자 이름과 암호가 올바르지 않으면 대화 상자 만 표시되기 때문입니다. 자격 증명이 맞다면 다른 것을하기 위해 else 조건을 추가해야 할 것입니다. –

+0

감사합니다. 지금은 이해합니다. – user2883071