2014-05-13 28 views
0

我有一个文本框,它接受用户输入并检查输入是否正确。 如果输入不正确,我做了一个对话框,要求用户再次输入信息,并附上计数,说明剩下的尝试次数。但是,对话框不断倒数,并且不允许用户输入任何数据。在Python中的循环内获取输入形式

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

我在说我看不出为什么“如果”部分存在。 – 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被调用。在点击它将得到用户并通过并检查它们。如果他们不正确,它会告诉你多少次尝试,然后增加计数器,但是如何知道等待用户再次按下按钮? – user2883071

+1

因为GUI是事件驱动的。 wxPython等待你做“某事”,比如点击按钮。每次点击按钮时,它都会运行事件处理程序,检查用户名和密码并显示对话框。我添加了** if语句**,因为如果用户名和密码不正确,它应该只显示对话框。如果凭据是正确的,您将需要添加其他条件来执行其他操作。 –

+0

谢谢,我现在明白了。 – user2883071