【本期导读】 完成病人资料修改模块
终于有空学习python了,五一放了七天假,回家看了看,原来世界每个角落天天都在变化,就连生我养我的那个小村庄也有较大的变化,差点不记得回家的路了。
本以为这个小系统不会耗费太多时间的,可是一路做下来发现实际应用中还是会遇到很多困难的。最新几天看了看病人资料登记的代码,发现不够简洁,结构不太好,于是花了两天时间整理了一下,抽象出一个病案管理的基类,然后登记,修改,查询都继承这个基类,只是这些子类的有些方法需要重写父类方法以便适应不同的业务过程。重构后的病安管理模块代码如下:
病历管理模块
1
#!/usr/bin/python
2
# -*- coding: UTF-8 -*-
3
# $Id: PatientManage.py 39 2006-05-16 09:40:52Z Administrator $
4
"""
5
病历管理界面
6
"""
7
import wx
8
import wx.lib.scrolledpanel as scroll
9![]()
10
import globals
11
import MessageService
12
import PatientManageService as PMS
13
import DictionaryService as DS
14![]()
15
class PatientManagePanelBase(scroll.ScrolledPanel):
16
"""
17
病历管理基类
18
"""
19
20
def __init__(self,parent,editable=True):
21
scroll.ScrolledPanel.__init__(self,parent,wx.ID_ANY)
22
self.SetupScrolling()
23
self.SetAutoLayout(1)
24
self.SetBackgroundColour(self.GetParent().GetBackgroundColour())
25![]()
26
self.dic=DS.DictionaryService()
27
self.pm=PMS.PatientManageService()
28
29
self.ShowBasicInfo()
30
self.ShowDiseaseHistory()
31
self.ShowPrescription()
32
self.ShowControlPanel()
33
34
self.sizer=wx.BoxSizer(wx.VERTICAL)
35
self.sizer.Add(self.patientSizer, 0, wx.TOP|wx.LEFT, 3)
36
self.sizer.Add(self.centersizer, 0, wx.TOP|wx.LEFT, 3)
37
self.sizer.Add(self.controlsizer, 0, wx.TOP|wx.LEFT, 3)
38
self.SetSizer(self.sizer)
39![]()
40
self.SetEditable(editable)
41
42
def controls(self):
43
controls={self.txtName:"患者姓名",
44
self.cbIdType:"证件类型",
45
self.txtId:"证件号码",
46
self.txtAddress:"患者联系地址",
47
self.cbSex:"性别",
48
self.txtDisease:"病症详细信息",
49
self.txtSuggestion:"医生建议"}
50
return controls.items()
51
52
def SetEditable(self,editable=True):
53
## self.lblNew.Show(editable)
54
controls=[self.cbIdType,self.txtPatientId,self.txtId,self.txtName,self.cbSex,self.dpcBirthday,self.txtAge,self.txtAddress,
55
self.diseaseType,self.txtDisease,self.dpcStart,self.txtSuggestion,
56
self.meds,
57
self.cbOperator
58
]
59
for control in controls:
60
control.Enable(editable)
61
62
def InitBasicInfo(self,idType=[],sex=[]):
63
self.idType=idType
64
self.sex=sex
65
66
def ShowBasicInfo(self):
67
"""
68
病人基本信息
69
"""
70
self.InitBasicInfo()
71
72
#证件类型
73
self.cbIdType = wx.ComboBox(self, wx.ID_ANY,"",(0,0),
74
(80, -1), self.idType,
75
wx.CB_DROPDOWN
76
)
77![]()
78
#证件号码
79
self.txtId=wx.TextCtrl(self, wx.ID_ANY, "", size=(150, -1))
80
#病人编号
81
self.txtPatientId=wx.TextCtrl(self, wx.ID_ANY, "", size=(150, -1))
82
#self.txtPatientId.SetEditable(False)
83
self.lblNew = wx.StaticText(self, wx.ID_ANY, "新")
84
self.lblNew.SetForegroundColour( "Blue" )
85
self.lblNew.SetFont(wx.Font(13, wx.SWISS, wx.NORMAL, wx.BOLD))
86![]()
87
idsSizer = wx.BoxSizer(wx.HORIZONTAL)
88
89
idsSizer.Add(self.cbIdType, 0, wx.TOP|wx.LEFT, 3)
90
idsSizer.Add(self.txtId, 0, wx.TOP|wx.LEFT,3)
91
idsSizer.Add((150,0))
92
idsSizer.Add(self.txtPatientId, 0, wx.TOP|wx.LEFT,3)
93
idsSizer.Add(self.lblNew, 0, wx.TOP|wx.LEFT,3)
94
#姓名
95
lblName = wx.StaticText(self, wx.ID_ANY, "姓名:")
96
self.txtName=wx.TextCtrl(self, wx.ID_ANY, "", size=(100, -1))
97
self.txtId.SetFocus()
98
#性别
99
lblSex = wx.StaticText(self, wx.ID_ANY, "性别:")
100
self.cbSex = wx.ComboBox(self, wx.ID_ANY, "",(0,0),
101
(40, -1), self.sex,
102
wx.CB_DROPDOWN
103
)
104
#出生日期
105
lblBirthday = wx.StaticText(self, wx.ID_ANY, "出生日期:")
106
self.dpcBirthday = wx.DatePickerCtrl(self, size=(120,-1),
107
style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)
108
#年龄
109
lblAge = wx.StaticText(self, wx.ID_ANY, "年龄:")
110
self.txtAge=wx.TextCtrl(self, wx.ID_ANY, "", size=(40, -1))
111
self.txtAge.SetEditable(False)
112
lblUnit = wx.StaticText(self, wx.ID_ANY, "周岁")
113
lblUnit.SetFont(wx.Font(13, wx.SWISS, wx.NORMAL, wx.BOLD))
114
#家庭地址
115
lblAddress = wx.StaticText(self, wx.ID_ANY, "家庭地址:")
116
self.txtAddress=wx.TextCtrl(self, wx.ID_ANY, "", size=(475, -1))
117
118
addresssizer=wx.BoxSizer(wx.HORIZONTAL)
119
addresssizer.Add(lblAddress, 0, wx.TOP|wx.LEFT, 3)
120
addresssizer.Add(self.txtAddress, 0, wx.TOP|wx.LEFT, 3)
121
122
infosizer = wx.BoxSizer(wx.HORIZONTAL)
123
infosizer.Add(lblName, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER,3)
124
infosizer.Add(self.txtName, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER,3)
125
infosizer.Add((10,0))
126
infosizer.Add(lblSex, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER, 3)
127
infosizer.Add(self.cbSex, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER, 3)
128
infosizer.Add((20,0))
129
infosizer.Add(lblBirthday, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER,3)
130
infosizer.Add(self.dpcBirthday, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER,3)
131
infosizer.Add(lblAge, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER,3)
132
infosizer.Add(self.txtAge, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER,3)
133
infosizer.Add(lblUnit, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER,3)
134
135
infobox = wx.StaticBox(self, wx.ID_ANY,"病人基本信息")
136
self.patientSizer = wx.StaticBoxSizer(infobox,wx.VERTICAL)
137
138
self.patientSizer.Add(idsSizer, 0, wx.TOP|wx.LEFT, 10)
139
self.patientSizer.Add(infosizer, 0, wx.TOP|wx.LEFT, 10)
140
self.patientSizer.Add(addresssizer, 0, wx.TOP|wx.LEFT, 10)
141![]()
142
self.BindEventBasicInfo()
143
144
def BindEventBasicInfo(self):
145
pass
146
147
def InitDiseaseHistory(self,diseaseList=[]):
148
self.diseaseList=diseaseList
149
150
def ShowDiseaseHistory(self):
151
"""
152
病历信息
153
"""
154
self.InitDiseaseHistory()
155
156
#挂号
157
lblRegId=wx.StaticText(self, wx.ID_ANY, "挂号:")
158
self.txtRegId=wx.TextCtrl(self, wx.ID_ANY, "", size=(150, -1))
159
#病症列表
160
lblDiseaseType=wx.StaticText(self, wx.ID_ANY, "请选择患病情况:")
161
self.diseaseType = wx.CheckListBox(self, wx.ID_ANY, (80, 50), (150,60), self.diseaseList)
162
#病症描述
163
lblDisease=wx.StaticText(self, wx.ID_ANY, "病症详细描述:")
164
self.txtDisease=wx.TextCtrl(self, wx.ID_ANY, "", size=(200, 60))
165
#病症开始时间
166
lblStart=wx.StaticText(self, wx.ID_ANY, "病症开始时间:")
167
self.dpcStart= wx.DatePickerCtrl(self, size=(120,-1),
168
style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)
169
#医生建议
170
lblSuggestion=wx.StaticText(self, wx.ID_ANY, "医生建议:")
171
self.txtSuggestion=wx.TextCtrl(self, wx.ID_ANY, "", size=(200, 60))
172![]()
173
diseasebox = wx.StaticBox(self, wx.ID_ANY,"病历信息")
174
self.diseasesizer = wx.StaticBoxSizer(diseasebox,wx.VERTICAL)
175
176
self.diseasesizer.Add(lblRegId, 0, wx.TOP|wx.LEFT, 3)
177
self.diseasesizer.Add(self.txtRegId, 0, wx.TOP|wx.LEFT, 3)
178
self.diseasesizer.Add(lblDiseaseType, 0, wx.TOP|wx.LEFT, 3)
179
self.diseasesizer.Add(self.diseaseType, 0, wx.TOP|wx.LEFT, 3)
180
self.diseasesizer.Add(lblDisease, 0, wx.TOP|wx.LEFT, 3)
181
self.diseasesizer.Add(self.txtDisease, 0, wx.TOP|wx.LEFT, 3)
182
self.diseasesizer.Add(lblStart, 0, wx.TOP|wx.LEFT, 3)
183
self.diseasesizer.Add(self.dpcStart, 0, wx.TOP|wx.LEFT, 3)
184
self.diseasesizer.Add(lblSuggestion, 0, wx.TOP|wx.LEFT,3)
185
self.diseasesizer.Add(self.txtSuggestion, 0, wx.TOP|wx.LEFT, 3)
186![]()
187
self.BindEventDiseaseHistory()
188![]()
189
def BindEventDiseaseHistory(self):
190
pass
191
192
def InitPrescription(self,medsList=[]):
193
self.medsList=medsList
194
195
def ShowPrescription(self):
196
"""
197
处方信息
198
"""
199
self.InitPrescription()
200
201
lblmed=wx.StaticText(self, wx.ID_ANY, "【请在使用的药品前打勾】", (45, 15))
202
self.meds = wx.CheckListBox(self, wx.ID_ANY, (80, 50), (150,303), self.medsList)
203
#处方
204
#药品 TODO:支持多条记录,可从库存中选择
205
medicinebox = wx.StaticBox(self, wx.ID_ANY,"处方")
206
medicinesizer = wx.StaticBoxSizer(medicinebox,wx.VERTICAL)
207
medicinesizer.Add(lblmed,0,wx.TOP|wx.LEFT, 3)
208
medicinesizer.Add(self.meds,0,wx.TOP|wx.LEFT, 3)
209![]()
210
self.lblDes=wx.StaticText(self, wx.ID_ANY,"")
211
self.lblDes.SetFont(wx.Font(15, wx.SWISS, wx.NORMAL, wx.BOLD))
212
descsizer= wx.BoxSizer(wx.HORIZONTAL)
213
descsizer.Add(self.lblDes, 0, wx.TOP|wx.LEFT, 3)
214
215
self.centersizer= wx.BoxSizer(wx.HORIZONTAL)
216
self.centersizer.Add(self.diseasesizer, 0, wx.TOP|wx.LEFT, 3)
217
self.centersizer.Add(medicinesizer, 0, wx.TOP|wx.LEFT, 3)
218
self.centersizer.Add(descsizer, 0, wx.TOP|wx.LEFT, 3)
219![]()
220
self.BindEventPrescription()
221![]()
222
def BindEventPrescription(self):
223
pass
224
225
def InitControlPanel(self,operator=[]):
226
self.operator=operator
227
228
def ShowControlPanel(self):
229
"""
230
控制面板
231
"""
232
self.InitControlPanel()
233
234
#登记人
235
lblOperator = wx.StaticText(self, wx.ID_ANY, "登记人:")
236
self.cbOperator = wx.ComboBox(self, wx.ID_ANY, globals.username,(0,0),
237
(95, -1), self.operator,
238
wx.CB_DROPDOWN)
239
#『登记』按钮
240
self.btnAdd=wx.Button(self, wx.ID_ANY, "登记&A")
241
#『取消』按钮
242
self.btnCancel=wx.Button(self, wx.ID_ANY, "取消&C")
243
244
controlbox = wx.StaticBox(self, wx.ID_ANY,"")
245
246
self.controlsizer = wx.StaticBoxSizer(controlbox,wx.HORIZONTAL)
247
self.controlsizer.Add(lblOperator, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER, 3)
248
self.controlsizer.Add(self.cbOperator, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER, 3)
249
self.controlsizer.Add((270,0))
250
self.controlsizer.Add(self.btnAdd, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER, 3)
251
self.controlsizer.Add(self.btnCancel, 0, wx.TOP|wx.LEFT|wx.ALIGN_CENTER, 3)
252![]()
253
self.BindEventControlPanel()
254![]()
255
def BindEventControlPanel(self):
256
pass
257
258
def OnDpcStartEvtChar(self,event):
259
pass
260![]()
261
def OnTxtSuggestionEvtChar(self,event):
262
pass
263
264
def OnTxtDiseaseEvtChar(self,event):
265
pass
266![]()
267
def OnTxtIdEvtChar(self,event):
268
pass
269
270
def OnTxtNameEvtChar(self,event):
271
pass
272
273
def OnCbSexEvtChar(self,event):
274
pass
275
276
def OnDpcBirthdayEvtChar(self,event):
277
pass
278
279
def OnTxtAddressEvtChar(self,event):
280
pass
281
282
def OnTxtRegIdEvtChar(self,event):
283
pass
284![]()
285
def OnTxtPatientIdEvtChar(self,event):
286
pass
287
288
def EvtBirthdayChange(self,event):
289
pass
290
291
def EvtListBox(self,event):
292
pass
293
294
def EvtCheckListBox(self,event):
295
pass
296
297
def OnBtnAdd(self,event):
298
pass
299
300
def OnBtnCancel(self,event):
301
pass
302
303
class PatientManageModifyPanel(PatientManagePanelBase):
304
"""
305
病历修改
306
"""
307
def __init__(self,parent):
308
PatientManagePanelBase.__init__(self,parent,False)
309
self.btnAdd.SetLabel("修改(&M)")
310
self.txtPatientId.SetEditable(False)
311![]()
312
def InitBasicInfo(self):
313
self.idType=self.pm.listAllIdTypes()
314
self.sex=['男','女']
315![]()
316
def InitDiseaseHistory(self):
317
self.diseaseList=self.dic.listAllAvailableDiseaseTypeName()
318![]()
319
def InitPrescription(self):
320
self.medsList = self.dic.listAllAvailableGoodsName()
321![]()
322
def InitControlPanel(self):
323
self.operator=self.pm.listAllOperatorNames()
324
325
def BindEventDiseaseHistory(self):
326
self.txtRegId.Bind(wx.EVT_CHAR, self.OnTxtRegIdEvtChar)
327
self.txtDisease.Bind(wx.EVT_CHAR, self.OnTxtDiseaseEvtChar)
328
self.dpcStart.Bind(wx.EVT_CHAR, self.OnDpcStartEvtChar)
329
self.txtSuggestion.Bind(wx.EVT_CHAR, self.OnTxtSuggestionEvtChar)
330![]()
331
def BindEventPrescription(self):
332
self.Bind(wx.EVT_LISTBOX, self.EvtListBox,self.meds)
333
self.Bind(wx.EVT_CHECKLISTBOX, self.EvtCheckListBox,self.meds)
334![]()
335
def BindEventControlPanel(self):
336
self.Bind(wx.EVT_BUTTON,self.OnBtnAdd,self.btnAdd)
337
self.Bind(wx.EVT_BUTTON,self.OnBtnCancel,self.btnCancel)
338![]()
339
def OnDpcStartEvtChar(self,event):
340
if event.GetKeyCode()==13:
341
self.txtSuggestion.SetFocus()
342![]()
343
event.Skip()
344![]()
345
def OnTxtSuggestionEvtChar(self,event):
346
if event.GetKeyCode()==13:
347
self.meds.SetFocus()
348
self.meds.SetSelection(0)
349
event.Skip()
350
351
def OnTxtDiseaseEvtChar(self,event):
352
if event.GetKeyCode()==13:
353
self.dpcStart.SetFocus()
354![]()
355
event.Skip()
356
357
def OnBtnAdd(self,event):
358
#print self.GetCheckedMeds()
359
if self.CheckInfo()==False:
360
return
361
else:
362
self.SavePatientInfo()
363![]()
364
def SavePatientInfo(self):
365
"""
366
保存信息
367
"""
368
prescription=self.GetCheckedMeds()
369
diseases=self.GetCheckedDiseases()
370
371
patientInfo={}
372
patientInfo.__setitem__("idtype",unicode(self.cbIdType.GetValue()).encode('cp936'))
373
patientInfo.__setitem__("identityid",unicode(self.txtId.GetValue()).encode('cp936'))
374
patientInfo.__setitem__("patientid",unicode(self.txtPatientId.GetValue()).encode('cp936'))
375
patientInfo.__setitem__("name",unicode(self.txtName.GetValue()).encode('cp936'))
376
patientInfo.__setitem__("sex",unicode(self.cbSex.GetValue()).encode('cp936'))
377
patientInfo.__setitem__("birthday",unicode(self.dpcBirthday.GetValue().Format('%Y-%m-%d')).encode('cp936'))
378
patientInfo.__setitem__("address",unicode(self.txtAddress.GetValue()).encode('cp936'))
379
patientInfo.__setitem__("description",unicode(self.txtDisease.GetValue()).encode('cp936'))
380
patientInfo.__setitem__("start",unicode(self.dpcStart.GetValue().Format('%Y-%m-%d')).encode('cp936'))
381
patientInfo.__setitem__("suggestion",unicode(self.txtSuggestion.GetValue()).encode('cp936'))
382
patientInfo.__setitem__("operator",unicode(self.cbOperator.GetValue()).encode('cp936'))
383
patientInfo.__setitem__("registrationid",unicode(self.txtRegId.GetValue()).encode('cp936'))
384
patientInfo.__setitem__("diseases",diseases)
385
patientInfo.__setitem__("meds",prescription)
386![]()
387
try:
388
self.pm.updatePatientInfo(patientInfo)
389
MessageService.MessageBox(self,"修改成功!",wx.GetApp().GetAppName())
390
self.ClearUI()
391![]()
392
except Exception,errormsg:
393
MessageService.MessageBox(self,"出错了,详细信息如下:\n"+str(errormsg),wx.GetApp().GetAppName())
394
def OnBtnCancel(self,event):
395
self.ClearUI()
396![]()
397
def CheckInfo(self):
398
for name,value in self.controls():
399
if name.GetValue()=="":
400
MessageService.MessageBox(self,"请输入"+value+"!",wx.GetApp().GetAppName())
401
name.SetFocus()
402
return False
403
else:
404
return True
405
406
def ClearUI(self):
407
for name,value in self.controls():
408
name.SetValue("")
409
self.txtRegId.SetFocus()
410
411
def FillData(self,dic):
412
"""
413
填充控件
414
"""
415
d=wx.DateTime()
416
417
self.cbIdType.SetValue(dic.get('idtype'))
418
self.txtId.SetValue(dic.get('identityid'))
419
self.txtPatientId.SetValue(dic.get('patientid'))
420
self.txtName.SetValue(dic.get('name'))
421
self.cbSex.SetValue(dic.get('sex'))
422
423
list=dic.get('birthday').split('-')
424
d.Set(int(list[2]),int(list[1])-1,int(list[0]))
425
self.dpcBirthday.SetValue(d)
426
427
self.txtAddress.SetValue(dic.get('address'))
428
self.txtDisease.SetValue(dic.get('description'))
429![]()
430
list=dic.get('start').split('-')
431
d.Set(int(list[2]),int(list[1])-1,int(list[0]))
432
self.dpcStart.SetValue(d)
433
434
self.txtSuggestion.SetValue(dic.get('suggestion'))
435
self.cbOperator.SetValue(dic.get('operator'))
436![]()
437
self.diseaseType.Set(self.diseaseList)
438
for item in dic.get('diseases'):
439
## print item
440
for i in self.diseaseList:
441
## print i
442
if item==i:
443
self.diseaseType.Check(self.diseaseList.index(i),True)
444
445
self.meds.Set(self.medsList)
446
for item in dic.get('meds'):
447
for i in self.medsList:
448
if item==i:
449
self.meds.Check(self.medsList.index(i),True)
450
451
def OnTxtRegIdEvtChar(self,event):
452
if event.GetKeyCode()==13:
453
try:
454
##按挂号调出相应信息,返回字典
455
vals=self.pm.getPatientInfo(self.txtRegId.GetValue())
456
self.lblNew.Show(False)
457
self.SetEditable(True)
458
##填充控件
459
self.FillData(vals)
460![]()
461
except IndexError:
462
MessageService.MessageBox(self,"该挂号没有登记",wx.GetApp().GetAppName())
463
except Exception,msg:
464
MessageService.MessageBox(self,"异常错误,详细信息如下:\n"+str(msg),wx.GetApp().GetAppName())
465
466
event.Skip()
467![]()
468
def EvtListBox(self,event):
469
try:
470
#注意汉字编码
471
self.lblDes.SetLabel(
472
self.dic.getGoodsDescByFName
473
(
474
unicode(event.GetString()).encode('cp936')
475
)
476
)
477
except Exception,msg:
478
self.lblDes="[没有说明]"
479![]()
480
def GetCheckedMeds(self):
481
checked=[]
482
row=()
483
for i in range(0,self.meds.GetCount()):
484
if self.meds.IsChecked(i):
485
row=(
486
unicode(self.txtRegId.GetValue()).encode('cp936'),
487
self.dic.getGoodsIdByFName(unicode(self.meds.GetString(i)).encode('cp936'))
488
)
489
checked.append(row)
490
491
return tuple(checked)
492![]()
493
def GetCheckedDiseases(self):
494
checked=[]
495
row=()
496
for i in range(0,self.diseaseType.GetCount()):
497
if self.diseaseType.IsChecked(i):
498
row=(
499
unicode(self.txtRegId.GetValue()).encode('cp936'),
500
self.dic.getDiseaseTypeIdByName(unicode(self.diseaseType.GetString(i)).encode('cp936'))
501
)
502
checked.append(row)
503
return tuple(checked)
504
class PatientManageSearchPanel(PatientManagePanelBase):
505
"""
506
病历查询,TODO
507
"""
508
def __init__(self,parent):
509
PatientManagePanelBase.__init__(self,parent)
510
511
class PatientManageRegPanel(PatientManagePanelBase):
512
"""
513
病历登记
514
"""
515
def __init__(self,parent):
516
PatientManagePanelBase.__init__(self,parent)
517![]()
518
def InitBasicInfo(self):
519
self.idType=self.pm.listAllIdTypes()
520
self.sex=['男','女']
521![]()
522
def InitDiseaseHistory(self):
523
self.diseaseList=self.dic.listAllAvailableDiseaseTypeName()
524![]()
525
def InitPrescription(self):
526
self.medsList = self.dic.listAllAvailableGoodsName()
527![]()
528
def InitControlPanel(self):
529
self.operator=self.pm.listAllOperatorNames()
530
531
def BindEventBasicInfo(self):
532
self.txtId.Bind(wx.EVT_CHAR, self.OnTxtIdEvtChar)
533
self.txtPatientId.Bind(wx.EVT_CHAR, self.OnTxtPatientIdEvtChar)
534
self.txtName.Bind(wx.EVT_CHAR, self.OnTxtNameEvtChar)
535
self.cbSex.Bind(wx.EVT_CHAR, self.OnCbSexEvtChar)
536
self.dpcBirthday.Bind(wx.EVT_CHAR, self.OnDpcBirthdayEvtChar)
537
self.txtAddress.Bind(wx.EVT_CHAR, self.OnTxtAddressEvtChar)
538
self.Bind(wx.EVT_DATE_CHANGED,self.EvtBirthdayChange,self.dpcBirthday)
539
540
def BindEventDiseaseHistory(self):
541
self.txtRegId.Bind(wx.EVT_CHAR, self.OnTxtRegIdEvtChar)
542
self.txtDisease.Bind(wx.EVT_CHAR, self.OnTxtDiseaseEvtChar)
543
self.dpcStart.Bind(wx.EVT_CHAR, self.OnDpcStartEvtChar)
544
self.txtSuggestion.Bind(wx.EVT_CHAR, self.OnTxtSuggestionEvtChar)
545
546
def BindEventPrescription(self):
547
self.Bind(wx.EVT_LISTBOX, self.EvtListBox,self.meds)
548
self.Bind(wx.EVT_CHECKLISTBOX, self.EvtCheckListBox,self.meds)
549
550
def BindEventControlPanel(self):
551
self.Bind(wx.EVT_BUTTON,self.OnBtnAdd,self.btnAdd)
552
self.Bind(wx.EVT_BUTTON,self.OnBtnCancel,self.btnCancel)
553
554
def OnDpcStartEvtChar(self,event):
555
if event.GetKeyCode()==13:
556
self.txtSuggestion.SetFocus()
557![]()
558
event.Skip()
559![]()
560
def OnTxtSuggestionEvtChar(self,event):
561
if event.GetKeyCode()==13:
562
self.meds.SetFocus()
563
self.meds.SetSelection(0)
564
event.Skip()
565
566
def OnTxtDiseaseEvtChar(self,event):
567
if event.GetKeyCode()==13:
568
self.dpcStart.SetFocus()
569![]()
570
event.Skip()
571![]()
572
def OnTxtIdEvtChar(self,event):
573
if event.GetKeyCode()==13:
574
self.txtPatientId.SetFocus()
575![]()
576
event.Skip()
577
578
def OnTxtNameEvtChar(self,event):
579
if event.GetKeyCode()==13:
580
self.cbSex.SetFocus()
581
event.Skip()
582![]()
583
def OnCbSexEvtChar(self,event):
584
if event.GetKeyCode()==13:
585
self.dpcBirthday.SetFocus()
586
event.Skip()
587
588
def OnDpcBirthdayEvtChar(self,event):
589
if event.GetKeyCode()==13:
590
self.txtAddress.SetFocus()
591
event.Skip()
592
593
def OnTxtAddressEvtChar(self,event):
594
if event.GetKeyCode()==13:
595
self.txtRegId.SetFocus()
596![]()
597
event.Skip()
598
599
def OnTxtRegIdEvtChar(self,event):
600
if event.GetKeyCode()==13:
601
try:
602
self.txtRegId.SetValue(str(self.pm.genRegisterID()))
603
self.txtDisease.SetFocus()
604
except Exception,msg:
605
MessageService.MessageBox(self,"生成失败,详细信息如下:\n"+str(msg),wx.GetApp().GetAppName())
606![]()
607
def OnTxtPatientIdEvtChar(self,event):
608![]()
609
if event.GetKeyCode()==13:
610
try:
611
self.txtPatientId.SetValue(str(self.pm.genPatientID()))
612
self.txtName.SetFocus()
613
except Exception,msg:
614
MessageService.MessageBox(self,"生成失败,详细信息如下:\n"+str(msg),wx.GetApp().GetAppName())
615![]()
616
def EvtBirthdayChange(self,event):
617
self.txtAge.SetValue(str(wx.DateTime.Now()-self.dpcBirthday.GetValue()))
618
619
def EvtListBox(self,event):
620
try:
621
#注意汉字编码
622
self.lblDes.SetLabel(
623
self.dic.getGoodsDescByFName
624
(
625
unicode(event.GetString()).encode('cp936')
626
)
627
)
628
except Exception,msg:
629
self.lblDes="[没有说明]"
630
631
def GetCheckedMeds(self):
632
checked=[]
633
row=()
634
for i in range(0,self.meds.GetCount()):
635
if self.meds.IsChecked(i):
636
row=(
637
unicode(self.txtRegId.GetValue()).encode('cp936'),
638
self.dic.getGoodsIdByFName(unicode(self.meds.GetString(i)).encode('cp936'))
639
)
640
checked.append(row)
641
642
return tuple(checked)
643![]()
644
def GetCheckedDiseases(self):
645
checked=[]
646
row=()
647
for i in range(0,self.diseaseType.GetCount()):
648
if self.diseaseType.IsChecked(i):
649
row=(
650
unicode(self.txtRegId.GetValue()).encode('cp936'),
651
self.dic.getDiseaseTypeIdByName(unicode(self.diseaseType.GetString(i)).encode('cp936'))
652
)
653
checked.append(row)
654
return tuple(checked)
655
656
def OnBtnAdd(self,event):
657
#print self.GetCheckedMeds()
658
if self.CheckInfo()==False:
659
return
660
else:
661
self.SavePatientInfo()
662![]()
663
def SavePatientInfo(self):
664![]()
665
try:
666
#注意汉字编码
667
idtype=self.dic.getIdTypeIdByName(
668
unicode(self.cbIdType.GetValue()).encode('cp936')
669
)
670
except IndexError,msg:
671
MessageService.MessageBox(self,"请选择证件类型!",wx.GetApp().GetAppName())
672
self.cbIdType.SetFocus()
673
return
674
except Exception,errormsg:
675
MessageService.MessageBox(self,"出错了,详细信息如下:\n"+str(msg),wx.GetApp().GetAppName())
676
677
try:
678
#注意汉字编码
679
operator=self.dic.getOperatorIdByName(unicode(self.cbOperator.GetValue()).encode('cp936'))
680
except IndexError,msg:
681
MessageService.MessageBox(self,"选择登记人!",wx.GetApp().GetAppName())
682
self.cbOperator.SetFocus()
683
return
684
except Exception,errormsg:
685
MessageService.MessageBox(self,"出错了,详细信息如下:\n"+str(msg),wx.GetApp().GetAppName())
686
687
if unicode(self.cbSex.GetValue()).encode('cp936')=="男":
688
patientSex=1
689
elif unicode(self.cbSex.GetValue()).encode('cp936')=="女":
690
patientSex=0
691
else:
692
patientSex=None
693![]()
694
basicInfo= (
695
(
696
self.txtPatientId.GetValue(),
697
unicode(self.txtName.GetValue()).encode('cp936'),
698
locals().get('patientSex'),
699
self.dpcBirthday.GetValue().Format('%Y-%m-%d'),
700
locals().get('idtype'),
701
unicode(self.txtId.GetValue()).encode('cp936'),
702
unicode(self.txtAddress.GetValue()).encode('cp936'),
703
locals().get('operator')
704
),
705
)
706
707
diseaseHistory=(
708
(
709
unicode(self.txtRegId.GetValue()).encode('cp936'),
710
unicode(self.txtPatientId.GetValue()).encode('cp936'),
711
unicode(self.txtDisease.GetValue()).encode('cp936'),
712
self.dpcStart.GetValue().Format('%Y-%m-%d'),
713
unicode(self.txtSuggestion.GetValue()).encode('cp936'),
714
locals().get('operator')
715
),
716
)
717
prescription=self.GetCheckedMeds()
718
diseases=self.GetCheckedDiseases()
719
720
patientInfo=[basicInfo,diseaseHistory,prescription,diseases]
721![]()
722
try:
723
self.pm.regPatientInfo(patientInfo)
724
MessageService.MessageBox(self,"登记成功!",wx.GetApp().GetAppName())
725
self.ClearUI()
726
727
except Exception,errormsg:
728
MessageService.MessageBox(self,"出错了,详细信息如下:\n"+str(errormsg),wx.GetApp().GetAppName())
729
def OnBtnCancel(self,event):
730
self.ClearUI()
731![]()
732
def CheckInfo(self):
733
for name,value in self.controls():
734
if name.GetValue()=="":
735
MessageService.MessageBox(self,"请输入"+value+"!",wx.GetApp().GetAppName())
736
name.SetFocus()
737
return False
738
else:
739
return True
740
741
def ClearUI(self):
742
for name,value in self.controls():
743
name.SetValue("")
744
self.txtName.SetFocus()
745
746
class PatientManageFrame(wx.Frame):
747
def __init__(self,parent):
748
wx.Frame.__init__(self,parent,wx.ID_ANY)
749
panel=PatientManageRegPanel(self)
750
751
class LoginApp(wx.App):
752
def __init__(self):
753
import sys
754
wx.App.__init__(self,True,"PatientManager.log")
755
self.SetAppName("test")
756
"""
757
测试
758
"""
759
def OnInit(self):
760
frame=PatientManageFrame(None)
761
frame.Show()
762
return True
763
764
if __name__=='__main__':
765
app=LoginApp()
766
app.MainLoop()
767![]()
768
在做病历管理模块时主要遇到以下几个问题:
1.如何把list转成tuple
2.把日期字符串转成wx.DateTime类型
3.计算两个wx.DateTime类型值之间的相隔年数
第1个问题很简单,只是一开始我不知道,起初一直在找tuple是不是有添加项目的方法,可是没找到,然后又找list是不是有方法转成tuple,又没找到,最后才终于发现原来直接强制转换就可以了,如:
l=[1,3,4]
t=tuple(l)
原来list转为tuple就这么简单。
关于第2个问题,一开始也是在查wxPython的API文档,可是没有查到能直接把日期字符串转成wx.DateTime类型的方法,最后只能先解析日期字符串,然后再用Set方法把这个字符串中的日期信息写入wx.DateTime实例。
现在只剩下第3个问题还没有找到更好的解决办法,还是先留在这里,然后边做边想办法
-----------------------
【下期提示】完成当天登记信息一览
终于有空学习python了,五一放了七天假,回家看了看,原来世界每个角落天天都在变化,就连生我养我的那个小村庄也有较大的变化,差点不记得回家的路了。
本以为这个小系统不会耗费太多时间的,可是一路做下来发现实际应用中还是会遇到很多困难的。最新几天看了看病人资料登记的代码,发现不够简洁,结构不太好,于是花了两天时间整理了一下,抽象出一个病案管理的基类,然后登记,修改,查询都继承这个基类,只是这些子类的有些方法需要重写父类方法以便适应不同的业务过程。重构后的病安管理模块代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
1.如何把list转成tuple
2.把日期字符串转成wx.DateTime类型
3.计算两个wx.DateTime类型值之间的相隔年数
第1个问题很简单,只是一开始我不知道,起初一直在找tuple是不是有添加项目的方法,可是没找到,然后又找list是不是有方法转成tuple,又没找到,最后才终于发现原来直接强制转换就可以了,如:
l=[1,3,4]
t=tuple(l)
原来list转为tuple就这么简单。
关于第2个问题,一开始也是在查wxPython的API文档,可是没有查到能直接把日期字符串转成wx.DateTime类型的方法,最后只能先解析日期字符串,然后再用Set方法把这个字符串中的日期信息写入wx.DateTime实例。
现在只剩下第3个问题还没有找到更好的解决办法,还是先留在这里,然后边做边想办法
-----------------------
【下期提示】完成当天登记信息一览