在我们做应用时,绝大多数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 输入长度符合时 确定按钮可用