【本期导读】完成当天登记信息一览
在做【当天登记信息一览】这个模块时,结合平时的测试经验,设计表现形式,决定用wx.Notebook来做数据显示,第一页显示列表,第二页显示列表中选中记录的详细信息。
列表页使用wx.ListCtrl来显示数据,这里为求快速简单,就写了一个DataListCtrl类简单地继承了wx.ListCtrl这个类,主要扩充了数据填充方法,能将一个字典数据填入列表。主要的代码片断:

  1class PatientManageTodayListPanel(wx.Notebook):
  2    """
  3    当天登记一览
  4    """
  5    def __init__(self, parent):
  6        wx.Notebook.__init__(self, parent, wx.ID_ANY,style=wx.NB_NOPAGETHEME|wx.NB_BOTTOM)
  7        self.listPanel=PatientManageListPanel(self)
  8        self.detailPanel=PatientManageDetailPanel(self)
  9        self.AddPage(self.listPanel, "当天登记信息列表",select=True)
 10        self.AddPage(self.detailPanel, "当天登记信息详细信息",select=False)
 11        self.currentItem=0
 12        
 13        self.listPanel.list.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
 14        self.listPanel.list.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick)
 15        
 16    def OnItemSelected(self, event):
 17        self.currentItem = event.m_itemIndex
 18        
 19    def OnDoubleClick(self, event):
 20        self.detailPanel.ShowPatientInfo(self.listPanel.list.GetItemText(self.currentItem))
 21        self.SetSelection(1)
 22        
 23class PatientManageListPanel(wx.Panel,PatientManageBase):
 24    """
 25    当天登记一览列表
 26    """
 27    def __init__(self, parent):
 28        wx.Panel.__init__(self, parent, wx.ID_ANY, style=wx.WANTS_CHARS)
 29        PatientManageBase.__init__(self)
 30        data=utils.list2dic(self.pm.listTodayRegInfo())
 31        self.list=DataListCtrl.DataListCtrl(self,data)
 32        self.Bind(wx.EVT_SIZE, self.OnSize)
 33        self.list.Select(0)
 34        
 35    def OnSize(self, event):
 36        w,h = self.GetClientSizeTuple()
 37        self.list.SetDimensions(0, 0, w, h)
 38
 39class PatientManageDetailPanel(PatientManagePanelBase):
 40    """
 41    当天登记详细信息
 42    """
 43    def __init__(self, parent):
 44        PatientManagePanelBase.__init__(self,parent,False)
 45        self.btnAdd.Show(False)
 46        self.btnCancel.Show(False)
 47        self.lblNew.Show(False)        
 48
 49    def InitBasicInfo(self):
 50        self.idType=self.pm.listAllIdTypes()        
 51        self.sex=['','']
 52
 53    def InitDiseaseHistory(self):
 54        self.diseaseList=self.dic.listAllAvailableDiseaseTypeName()
 55
 56    def InitPrescription(self):
 57        self.medsList = self.dic.listAllAvailableGoodsName()
 58
 59    def InitControlPanel(self):
 60        self.operator=self.pm.listAllOperatorNames()
 61        
 62    def SetEditable(self,editable=True):
 63        controls=[self.cbIdType,self.txtPatientId,self.txtId,self.txtName,self.cbSex,self.dpcBirthday,self.txtAge,self.txtAddress,
 64                  self.txtRegId,self.diseaseType,self.txtDisease,self.dpcStart,self.txtSuggestion,
 65                  self.meds,
 66                  self.cbOperator
 67                  ]
 68        for control in controls:
 69            control.Enable(editable)
 70            
 71    def ShowPatientInfo(self,registrationId):
 72        vals=self.pm.getPatientInfo(registrationId)
 73        self.FillData(vals)
 74        
 75    def FillData(self,dic):
 76        """
 77        填充控件
 78        """
 79        d=wx.DateTime()
 80        
 81        self.cbIdType.SetValue(dic.get('idtype'))
 82        self.txtId.SetValue(dic.get('identityid'))
 83        self.txtPatientId.SetValue(dic.get('patientid'))
 84        self.txtName.SetValue(dic.get('name'))
 85        self.cbSex.SetValue(dic.get('sex'))
 86        
 87        list=dic.get('birthday').split('-')
 88        d.Set(int(list[2]),int(list[1])-1,int(list[0]))        
 89        self.dpcBirthday.SetValue(d)
 90
 91        self.txtRegId.SetValue(dic.get('registrationid'))        
 92        self.txtAddress.SetValue(dic.get('address'))
 93        self.txtDisease.SetValue(dic.get('description'))
 94
 95        list=dic.get('start').split('-')
 96        d.Set(int(list[2]),int(list[1])-1,int(list[0]))            
 97        self.dpcStart.SetValue(d)
 98        
 99        self.txtSuggestion.SetValue(dic.get('suggestion'))
100        self.cbOperator.SetValue(dic.get('operator'))
101
102        self.diseaseType.Set(self.diseaseList)
103        for item in dic.get('diseases'):
104##            print item
105            for i in self.diseaseList:
106##                print i
107                if item==i:
108                    self.diseaseType.Check(self.diseaseList.index(i),True)
109                    
110        self.meds.Set(self.medsList)   
111        for item in dic.get('meds'):
112            for i in self.medsList:
113                if item==i:
114                    self.meds.Check(self.medsList.index(i),True)

刚开始我把选中单条记录(OnItemSelected)和双击单条记录(OnDoubleClick)这两个方法也写在DataListCtrl类中,但后来发现这样写不太通用,于是把它们提出来写在PatientManageTodayListPanel这个类中,然后在这里绑定DataListCtrl的单选和双击事件。
之前遇到一个问题:如何在单击菜单后打开一个wx.Notbook的Page,再次单击这个菜单时能自动跳到这个打开的Page上?查过wx.Notebook的API文档,没有发现现存的查找Page的方法,于是就自己想办法解决,后来我是这样解决的:
用一个字典来记录Page是否打开,以及它的index
然后在显示这个Page的时候更新这个字典:
如何跳到打开的Page上
 1        ##用于记录菜单界面是否已经打开
 2        self.dicMenu={'病人资料录入':(False,-1),
 3                      '病人资料修改':(False,-1),
 4                      '当天登记信息一览':(False,-1)
 5                      }
 6                
 7    def ShowPatientInfoReg(self):
 8        """
 9        显示病历登记界面
10        """
11        if self.dicMenu.get('病人资料录入')[0]==True:
12            self.win.SetSelection(self.dicMenu.get('病人资料录入')[1])
13        else:
14            pm =PM.PatientManageRegPanel(self.win)
15            exists=self.win.AddPage(pm, "病人资料录入",select=True)
16            index=self.win.GetPageCount()-1
17            text=unicode(self.win.GetPageText(index)).encode('cp936')
18            self.dicMenu.__setitem__('病人资料录入',(exists,index))
19        self.Refresh()

截图:
todaydetail.jpg
todaylist.jpg
【下期提示】完成病历组合查询