在我们做应用时,绝大多数CS架构的系统都需要一个Login窗体,虽然写一个登陆窗体并不难,但是在面向对象大行其道的今天,模块的复用是提高开发效率的有效途径,一个好的coder也会开发一些通用的组建,提供给大家调用,组件往往与开发者的经验的设计理念有关,优秀coder开发的组建,许多项目和场景都可以拿来直接使用,spring、wxPython以及国内的云风开发的游戏引擎,很多公司都广泛的采用,其实很多优秀的Coder都能设计出好的组建,我也相信他们设计了很多好的组建,但是种种原因,导致其开发组建只在本公司和本小组内使用,大大削减了其效益,废话不多说,我这里抛砖引玉,提供一个wxPython的 Loggin
组建,如若有误,欢迎指正!
#coding:GBK ''' Created on 2012-4-18 @author: CaoZhongPing ''' TTIEL="登陆" USER="用户" PWD="密码" USR_LEN=5 PWD_LEN=6 BUTTON_OK="确认" BUTTON_CANCLE="取消" TOP_TIP="请输入用户名和密码 " DFAULT_USR="请输入5位用户名" DEFAULT_PWD="123456" import wx class LoginDialog(wx.Dialog): ''' 登陆对话窗体,请勿直接调用ShowModal() ,调用Show() ''' def __init__(self,parent=None,title=TTIEL,size=(300,220), userTxtLen=USR_LEN,pwdTxtLen=PWD_LEN): wx.Dialog.__init__(self,parent,-1,title,size=size, style=wx.DEFAULT_DIALOG_STYLE) self.txtCtrMap={} #缓存输入框 self.okBtn=None self.pwdLen = pwdTxtLen self.usrLen = userTxtLen self.CreateCompment() #构建label项 def _dataTxtLabel(self): return ((USER,0,self._OnUserTxtInput,DFAULT_USR), (PWD,wx.TE_PASSWORD,self._OnPwdInput,DEFAULT_PWD)) #构建button项 def _dataWithButton(self): return((wx.ID_OK,BUTTON_OK),(wx.ID_CANCEL,BUTTON_CANCLE)) #构建TextCtrl项 def _CreateTxtLabel(self, sizer, eachLabel, eachStyle, eachHandler,dvalue): box = wx.BoxSizer(wx.HORIZONTAL) label = wx.StaticText(self, -1, eachLabel) box.Add(label, 0, wx.ALIGN_CENTER| wx.ALL, 5) text = wx.TextCtrl(self, -1, dvalue, size = (150, -1), style = eachStyle) text.Bind(wx.EVT_TEXT, eachHandler) box.Add(text,1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALL,5) sizer.Add(box, 0, wx.ALIGN_CENTER| wx.ALL, 5) self.txtCtrMap[eachLabel]=text def _CreateButton(self, btnSizer, eachID, eachLabel): btn = wx.Button(self,eachID,eachLabel) if eachID==wx.ID_OK: btn.SetDefault() self.okBtn=btn btn.Disable() btnSizer.AddButton(btn) #根据数据项构建组建 def CreateCompment(self): sizer = wx.BoxSizer(wx.VERTICAL) topTip = wx.StaticText(self,-1,TOP_TIP) sizer.Add(topTip,0,wx.ALIGN_CENTER|wx.ALL,5) for eachLabel,eachStyle,eachHandler,dvalue in self._dataTxtLabel(): self._CreateTxtLabel(sizer,eachLabel,eachStyle,eachHandler,dvalue) btnSizer = wx.StdDialogButtonSizer() for eachID,eachLabel in self._dataWithButton(): self._CreateButton(btnSizer,eachID,eachLabel) btnSizer.Realize() sizer.Add(btnSizer,1,wx.ALIGN_CENTER_HORIZONTAL|wx.ALL,5) self.SetSizer(sizer) def _OnUserTxtInput(self,event): self._EnableOrDisableOkBtn() def _OnPwdInput(self,event): self._EnableOrDisableOkBtn() #确保两个框都有输入 def _EnableOrDisableOkBtn(self): self.okBtn.Enable() usrStr = self.txtCtrMap[USER].GetValue() pwdStr = self.txtCtrMap[PWD].GetValue() if len(usrStr)!= self.usrLen or len(pwdStr)!=self.pwdLen: self.okBtn.Disable() #调用该函数将显示窗体并确定后可返回结果 def Show(self): res = self.ShowModal() if res == wx.ID_OK: return (self.txtCtrMap[USER].GetValue(),self.txtCtrMap[PWD].GetValue()) if __name__ =='__main__': app = wx.PySimpleApp() log = LoginDialog() res =log.Show() print res log.Destroy() app.MainLoop()
以下是XP下的效果图:
1. 未输入时
2 长度不对 (user 5 ,pwd 6)
3 输入长度符合时 确定按钮可用