【本期導(dǎo)讀】
完成病人資料修改模塊
終于有空學(xué)習(xí)python了,五一放了七天假,回家看了看,原來世界每個角落天天都在變化,就連生我養(yǎng)我的那個小村莊也有較大的變化,差點不記得回家的路了。
本以為這個小系統(tǒng)不會耗費太多時間的,可是一路做下來發(fā)現(xiàn)實際應(yīng)用中還是會遇到很多困難的。最新幾天看了看病人資料登記的代碼,發(fā)現(xiàn)不夠簡潔,結(jié)構(gòu)不太好,于是花了兩天時間整理了一下,抽象出一個病案管理的基類,然后登記,修改,查詢都繼承這個基類,只是這些子類的有些方法需要重寫父類方法以便適應(yīng)不同的業(yè)務(wù)過程。重構(gòu)后的病安管理模塊代碼如下:

病歷管理模塊
??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:"患者聯(lián)系地址",
?47
??????????????????self.cbSex:"性別",
?48
??????????????????self.txtDisease:"病癥詳細(xì)信息",
?49
??????????????????self.txtSuggestion:"醫(yī)生建議"}
?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,?"病癥詳細(xì)描述:")
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
????????#醫(yī)生建議
170
????????lblSuggestion=wx.StaticText(self,?wx.ID_ANY,?"醫(yī)生建議:")
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,"出錯了,詳細(xì)信息如下:\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
????????????????##按掛號調(diào)出相應(yīng)信息,返回字典
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,"異常錯誤,詳細(xì)信息如下:\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,"生成失敗,詳細(xì)信息如下:\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,"生成失敗,詳細(xì)信息如下:\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,"出錯了,詳細(xì)信息如下:\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,"出錯了,詳細(xì)信息如下:\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,"出錯了,詳細(xì)信息如下:\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轉(zhuǎn)成tuple
2.把日期字符串轉(zhuǎn)成wx.DateTime類型
3.計算兩個wx.DateTime類型值之間的相隔年數(shù)
第1個問題很簡單,只是一開始我不知道,起初一直在找tuple是不是有添加項目的方法,可是沒找到,然后又找list是不是有方法轉(zhuǎn)成tuple,又沒找到,最后才終于發(fā)現(xiàn)原來直接強(qiáng)制轉(zhuǎn)換就可以了,如:
l=[1,3,4]
t=tuple(l)
原來list轉(zhuǎn)為tuple就這么簡單。
關(guān)于第2個問題,一開始也是在查wxPython的API文檔,可是沒有查到能直接把日期字符串轉(zhuǎn)成wx.DateTime類型的方法,最后只能先解析日期字符串,然后再用Set方法把這個字符串中的日期信息寫入wx.DateTime實例。
現(xiàn)在只剩下第3個問題還沒有找到更好的解決辦法,還是先留在這里,然后邊做邊想辦法
-----------------------


【下期提示】完成當(dāng)天登記信息一覽