【本期导读】完成当天登记信息一览
在做【当天登记信息一览】这个模块时,结合平时的测试经验,设计表现形式,决定用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() 截图:
【下期提示】完成病历组合查询