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

【下期提示】完成病历组合查询