【本期導讀】完成當天登記信息一覽
在做【當天登記信息一覽】這個模塊時,結合平時的測試經驗,設計表現形式,決定用wx.Notebook來做數據顯示,第一頁顯示列表,第二頁顯示列表中選中記錄的詳細信息。
列表頁使用wx.ListCtrl來顯示數據,這里為求快速簡單,就寫了一個DataListCtrl類簡單地繼承了wx.ListCtrl這個類,主要擴充了數據填充方法,能將一個字典數據填入列表。主要的代碼片斷:


??1
class?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
????????
?23
class?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
?39
class?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()截圖:

【下期提示】完成病歷組合查詢