Package Gnumed :: Package wxpython :: Module gmListWidgets
[frames] | no frames]

Source Code for Module Gnumed.wxpython.gmListWidgets

  1  """GNUmed list controls and widgets. 
  2   
  3  TODO: 
  4   
  5          From: Rob McMullen <rob.mcmullen@gmail.com> 
  6          To: wxPython-users@lists.wxwidgets.org 
  7          Subject: Re: [wxPython-users] ANN: ColumnSizer mixin for ListCtrl 
  8   
  9          Thanks for all the suggestions, on and off line.  There's an update 
 10          with a new name (ColumnAutoSizeMixin) and better sizing algorithm at: 
 11   
 12          http://trac.flipturn.org/browser/trunk/peppy/lib/column_autosize.py 
 13  """ 
 14  #================================================================ 
 15  __version__ = "$Revision: 1.37 $" 
 16  __author__ = "Karsten Hilbert <Karsten.Hilbert@gmx.net>" 
 17  __license__ = "GPL" 
 18   
 19   
 20  import sys, types 
 21   
 22   
 23  import wx 
 24  import wx.lib.mixins.listctrl as listmixins 
 25   
 26   
 27  if __name__ == '__main__': 
 28          sys.path.insert(0, '../../') 
 29  from Gnumed.business import gmPerson 
 30  from Gnumed.pycommon import gmTools, gmDispatcher 
 31  from Gnumed.wxpython import gmGuiHelpers 
 32  from Gnumed.wxGladeWidgets import wxgGenericListSelectorDlg, wxgGenericListManagerPnl 
 33   
 34  #================================================================ 
35 -def get_choices_from_list ( 36 parent=None, 37 msg=None, 38 caption=None, 39 choices=None, 40 selections=None, 41 columns=None, 42 data=None, 43 edit_callback=None, 44 new_callback=None, 45 delete_callback=None, 46 refresh_callback=None, 47 single_selection=False, 48 can_return_empty=False, 49 ignore_OK_button=False, 50 left_extra_button=None, 51 middle_extra_button=None, 52 right_extra_button=None):
53 """Let user select item(s) from a list. 54 55 - new_callback: () 56 - edit_callback: (item data) 57 - delete_callback: (item data) 58 - refresh_callback: (listctrl) 59 60 - left/middle/right_extra_button: (label, tooltip, <callback>) 61 <callback> is called with item_data as the only argument 62 63 returns None if cancelled 64 returns list (may be empty) of selected items 65 """ 66 if caption is None: 67 caption = _('generic multi choice dialog') 68 69 if single_selection: 70 dlg = cGenericListSelectorDlg(parent, -1, title = caption, msg = msg, style = wx.LC_SINGLE_SEL) 71 else: 72 dlg = cGenericListSelectorDlg(parent, -1, title = caption, msg = msg) 73 74 dlg.refresh_callback = refresh_callback 75 dlg.edit_callback = edit_callback 76 dlg.new_callback = new_callback 77 dlg.delete_callback = delete_callback 78 79 dlg.ignore_OK_button = ignore_OK_button 80 dlg.left_extra_button = left_extra_button 81 dlg.middle_extra_button = middle_extra_button 82 dlg.right_extra_button = right_extra_button 83 84 dlg.set_columns(columns = columns) 85 86 if refresh_callback is None: 87 dlg.set_string_items(items = choices) # list ctrl will refresh anyway if possible 88 dlg.set_column_widths() 89 90 if data is not None: 91 dlg.set_data(data = data) # can override data set if refresh_callback is not None 92 93 if selections is not None: 94 dlg.set_selections(selections = selections) 95 dlg.can_return_empty = can_return_empty 96 97 btn_pressed = dlg.ShowModal() 98 sels = dlg.get_selected_item_data(only_one = single_selection) 99 dlg.Destroy() 100 101 if btn_pressed == wx.ID_OK: 102 if can_return_empty and (sels is None): 103 return [] 104 return sels 105 106 return None
107 #----------------------------------------------------------------
108 -class cGenericListSelectorDlg(wxgGenericListSelectorDlg.wxgGenericListSelectorDlg):
109 """A dialog holding a list and a few buttons to act on the items.""" 110
111 - def __init__(self, *args, **kwargs):
112 113 try: 114 msg = kwargs['msg'] 115 del kwargs['msg'] 116 except KeyError: msg = None 117 118 wxgGenericListSelectorDlg.wxgGenericListSelectorDlg.__init__(self, *args, **kwargs) 119 120 if msg is None: 121 self._LBL_message.Hide() 122 else: 123 self._LBL_message.SetLabel(msg) 124 125 self.left_extra_button = None 126 self.middle_extra_button = None 127 self.right_extra_button = None 128 129 self.refresh_callback = None # called when new/edit/delete callbacks return True (IOW were not cancelled) 130 self.new_callback = None # called when NEW button pressed, no argument passed in 131 self.edit_callback = None # called when EDIT button pressed, data of topmost selected item passed in 132 self.delete_callback = None # called when DELETE button pressed, data of topmost selected item passed in 133 134 self.ignore_OK_button = False # by default do show/use the OK button 135 136 self.can_return_empty = False
137 #------------------------------------------------------------
138 - def set_columns(self, columns=None):
139 self._LCTRL_items.set_columns(columns = columns)
140 #------------------------------------------------------------
141 - def set_column_widths(self, widths=None):
142 self._LCTRL_items.set_column_widths(widths = widths)
143 #------------------------------------------------------------
144 - def set_string_items(self, items = None):
145 self._LCTRL_items.set_string_items(items = items) 146 self._LCTRL_items.set_column_widths() 147 self._LCTRL_items.Select(0)
148 #------------------------------------------------------------
149 - def set_selections(self, selections = None):
150 self._LCTRL_items.set_selections(selections = selections)
151 #------------------------------------------------------------
152 - def set_data(self, data = None):
153 self._LCTRL_items.set_data(data = data)
154 #------------------------------------------------------------
155 - def get_selected_item_data(self, only_one=False):
156 return self._LCTRL_items.get_selected_item_data(only_one=only_one)
157 #------------------------------------------------------------ 158 # event handlers 159 #------------------------------------------------------------
160 - def _on_list_item_selected(self, event):
161 if not self.__ignore_OK_button: 162 self._BTN_ok.SetDefault() 163 self._BTN_ok.Enable(True) 164 165 if self.edit_callback is not None: 166 self._BTN_edit.Enable(True) 167 168 if self.delete_callback is not None: 169 self._BTN_delete.Enable(True)
170 #------------------------------------------------------------
171 - def _on_list_item_deselected(self, event):
172 if self._LCTRL_items.get_selected_items(only_one=True) == -1: 173 if not self.can_return_empty: 174 self._BTN_cancel.SetDefault() 175 self._BTN_ok.Enable(False) 176 self._BTN_edit.Enable(False) 177 self._BTN_delete.Enable(False)
178 #------------------------------------------------------------
179 - def _on_new_button_pressed(self, event):
180 if not self.new_callback(): 181 return 182 if self.refresh_callback is None: 183 return 184 wx.BeginBusyCursor() 185 try: 186 self.refresh_callback(lctrl = self._LCTRL_items) 187 finally: 188 wx.EndBusyCursor() 189 self._LCTRL_items.set_column_widths()
190 #------------------------------------------------------------
191 - def _on_edit_button_pressed(self, event):
192 # if the edit button *can* be pressed there are *supposed* 193 # to be both an item selected and an editor configured 194 if not self.edit_callback(self._LCTRL_items.get_selected_item_data(only_one=True)): 195 return 196 if self.refresh_callback is None: 197 return 198 wx.BeginBusyCursor() 199 try: 200 self.refresh_callback(lctrl = self._LCTRL_items) 201 finally: 202 wx.EndBusyCursor() 203 self._LCTRL_items.set_column_widths()
204 #------------------------------------------------------------
205 - def _on_delete_button_pressed(self, event):
206 # if the delete button *can* be pressed there are *supposed* 207 # to be both an item selected and a deletor configured 208 item_data = self._LCTRL_items.get_selected_item_data(only_one=True) 209 if item_data is None: 210 return 211 if not self.delete_callback(item_data): 212 return 213 if self.refresh_callback is None: 214 return 215 wx.BeginBusyCursor() 216 try: 217 self.refresh_callback(lctrl = self._LCTRL_items) 218 finally: 219 wx.EndBusyCursor() 220 self._LCTRL_items.set_column_widths()
221 #------------------------------------------------------------
222 - def _on_left_extra_button_pressed(self, event):
223 item_data = self._LCTRL_items.get_selected_item_data(only_one=True) 224 if not self.__left_extra_button_callback(item_data): 225 return 226 if self.refresh_callback is None: 227 return 228 wx.BeginBusyCursor() 229 try: 230 self.refresh_callback(lctrl = self._LCTRL_items) 231 finally: 232 wx.EndBusyCursor() 233 self._LCTRL_items.set_column_widths()
234 #------------------------------------------------------------
235 - def _on_middle_extra_button_pressed(self, event):
236 item_data = self._LCTRL_items.get_selected_item_data(only_one=True) 237 if not self.__middle_extra_button_callback(item_data): 238 return 239 if self.refresh_callback is None: 240 return 241 wx.BeginBusyCursor() 242 try: 243 self.refresh_callback(lctrl = self._LCTRL_items) 244 finally: 245 wx.EndBusyCursor() 246 self._LCTRL_items.set_column_widths()
247 #------------------------------------------------------------
248 - def _on_right_extra_button_pressed(self, event):
249 item_data = self._LCTRL_items.get_selected_item_data(only_one=True) 250 if not self.__right_extra_button_callback(item_data): 251 return 252 if self.refresh_callback is None: 253 return 254 wx.BeginBusyCursor() 255 try: 256 self.refresh_callback(lctrl = self._LCTRL_items) 257 finally: 258 wx.EndBusyCursor() 259 self._LCTRL_items.set_column_widths()
260 #------------------------------------------------------------ 261 # properties 262 #------------------------------------------------------------
263 - def _set_ignore_OK_button(self, ignored):
264 self.__ignore_OK_button = ignored 265 if self.__ignore_OK_button: 266 self._BTN_ok.Enable(False) 267 self._BTN_ok.Hide() 268 else: 269 self._BTN_ok.Enable(True) 270 self._BTN_ok.Show()
271 272 ignore_OK_button = property(lambda x:x, _set_ignore_OK_button) 273 #------------------------------------------------------------
274 - def _set_left_extra_button(self, definition):
275 if definition is None: 276 self._BTN_extra_left.Enable(False) 277 self._BTN_extra_left.Hide() 278 return 279 280 (label, tooltip, callback) = definition 281 if not callable(callback): 282 raise ValueError('<left extra button> callback is not a callable: %s' % callback) 283 self.__left_extra_button_callback = callback 284 self._BTN_extra_left.SetLabel(label) 285 self._BTN_extra_left.SetToolTipString(tooltip) 286 self._BTN_extra_left.Enable(True) 287 self._BTN_extra_left.Show()
288 289 left_extra_button = property(lambda x:x, _set_left_extra_button) 290 #------------------------------------------------------------
291 - def _set_middle_extra_button(self, definition):
292 if definition is None: 293 self._BTN_extra_middle.Enable(False) 294 self._BTN_extra_middle.Hide() 295 return 296 297 (label, tooltip, callback) = definition 298 if not callable(callback): 299 raise ValueError('<middle extra button> callback is not a callable: %s' % callback) 300 self.__middle_extra_button_callback = callback 301 self._BTN_extra_middle.SetLabel(label) 302 self._BTN_extra_middle.SetToolTipString(tooltip) 303 self._BTN_extra_middle.Enable(True) 304 self._BTN_extra_middle.Show()
305 306 middle_extra_button = property(lambda x:x, _set_middle_extra_button) 307 #------------------------------------------------------------
308 - def _set_right_extra_button(self, definition):
309 if definition is None: 310 self._BTN_extra_right.Enable(False) 311 self._BTN_extra_right.Hide() 312 return 313 314 (label, tooltip, callback) = definition 315 if not callable(callback): 316 raise ValueError('<right extra button> callback is not a callable: %s' % callback) 317 self.__right_extra_button_callback = callback 318 self._BTN_extra_right.SetLabel(label) 319 self._BTN_extra_right.SetToolTipString(tooltip) 320 self._BTN_extra_right.Enable(True) 321 self._BTN_extra_right.Show()
322 323 right_extra_button = property(lambda x:x, _set_right_extra_button) 324 #------------------------------------------------------------
325 - def _get_new_callback(self):
326 return self.__new_callback
327
328 - def _set_new_callback(self, callback):
329 if callback is not None: 330 if self.refresh_callback is None: 331 raise ValueError('refresh callback must be set before new callback can be set') 332 if not callable(callback): 333 raise ValueError('<new> callback is not a callable: %s' % callback) 334 self.__new_callback = callback 335 336 if callback is None: 337 self._BTN_new.Enable(False) 338 self._BTN_new.Hide() 339 else: 340 self._BTN_new.Enable(True) 341 self._BTN_new.Show()
342 343 new_callback = property(_get_new_callback, _set_new_callback) 344 #------------------------------------------------------------
345 - def _get_edit_callback(self):
346 return self.__edit_callback
347
348 - def _set_edit_callback(self, callback):
349 if callback is not None: 350 if self.refresh_callback is None: 351 raise ValueError('refresh callback must be set before edit callback can be set') 352 if not callable(callback): 353 raise ValueError('<edit> callback is not a callable: %s' % callback) 354 self.__edit_callback = callback 355 356 if callback is None: 357 self._BTN_edit.Enable(False) 358 self._BTN_edit.Hide() 359 else: 360 self._BTN_edit.Enable(True) 361 self._BTN_edit.Show()
362 363 edit_callback = property(_get_edit_callback, _set_edit_callback) 364 #------------------------------------------------------------
365 - def _get_delete_callback(self):
366 return self.__delete_callback
367
368 - def _set_delete_callback(self, callback):
369 if callback is not None: 370 if self.refresh_callback is None: 371 raise ValueError('refresh callback must be set before delete callback can be set') 372 if not callable(callback): 373 raise ValueError('<delete> callback is not a callable: %s' % callback) 374 self.__delete_callback = callback 375 376 if callback is None: 377 self._BTN_delete.Enable(False) 378 self._BTN_delete.Hide() 379 else: 380 self._BTN_delete.Enable(True) 381 self._BTN_delete.Show()
382 383 delete_callback = property(_get_delete_callback, _set_delete_callback) 384 #------------------------------------------------------------
385 - def _get_refresh_callback(self):
386 return self.__refresh_callback
387
389 wx.BeginBusyCursor() 390 try: 391 self.refresh_callback(lctrl = self._LCTRL_items) 392 finally: 393 wx.EndBusyCursor() 394 self._LCTRL_items.set_column_widths()
395
396 - def _set_refresh_callback(self, callback):
397 if callback is not None: 398 if not callable(callback): 399 raise ValueError('<refresh> callback is not a callable: %s' % callback) 400 self.__refresh_callback = callback 401 if callback is not None: 402 wx.CallAfter(self._set_refresh_callback_helper)
403 404 refresh_callback = property(_get_refresh_callback, _set_refresh_callback)
405 #================================================================
406 -class cGenericListManagerPnl(wxgGenericListManagerPnl.wxgGenericListManagerPnl):
407 """A panel holding a generic multi-column list and action buttions.""" 408
409 - def __init__(self, *args, **kwargs):
410 411 try: 412 msg = kwargs['msg'] 413 del kwargs['msg'] 414 except KeyError: msg = None 415 416 wxgGenericListManagerPnl.wxgGenericListManagerPnl.__init__(self, *args, **kwargs) 417 418 if msg is None: 419 self._LBL_message.Hide() 420 else: 421 self._LBL_message.SetLabel(msg) 422 423 # new/edit/delete must return True/False to enable refresh 424 self.__new_callback = None # called when NEW button pressed, no argument passed in 425 self.edit_callback = None # called when EDIT button pressed, data of topmost selected item passed in 426 self.delete_callback = None # called when DELETE button pressed, data of topmost selected item passed in 427 self.refresh_callback = None # called when new/edit/delete callbacks return True (IOW were not cancelled)
428 #------------------------------------------------------------ 429 # external API 430 #------------------------------------------------------------
431 - def set_columns(self, columns=None):
432 self._LCTRL_items.set_columns(columns = columns)
433 #------------------------------------------------------------
434 - def set_string_items(self, items = None):
435 self._LCTRL_items.set_string_items(items = items) 436 self._LCTRL_items.set_column_widths() 437 438 if (items is None) or (len(items) == 0): 439 self._BTN_edit.Enable(False) 440 self._BTN_remove.Enable(False) 441 else: 442 self._LCTRL_items.Select(0)
443 #------------------------------------------------------------
444 - def set_selections(self, selections = None):
445 self._LCTRL_items.set_selections(selections = selections)
446 #------------------------------------------------------------
447 - def set_data(self, data = None):
448 self._LCTRL_items.set_data(data = data)
449 #------------------------------------------------------------
450 - def get_selected_item_data(self, only_one=False):
451 return self._LCTRL_items.get_selected_item_data(only_one=only_one)
452 #------------------------------------------------------------ 453 # event handlers 454 #------------------------------------------------------------
455 - def _on_list_item_selected(self, event):
456 if self.edit_callback is not None: 457 self._BTN_edit.Enable(True) 458 if self.delete_callback is not None: 459 self._BTN_remove.Enable(True)
460 #------------------------------------------------------------
461 - def _on_list_item_deselected(self, event):
462 if self._LCTRL_items.get_selected_items(only_one=True) == -1: 463 self._BTN_edit.Enable(False) 464 self._BTN_remove.Enable(False)
465 #------------------------------------------------------------
466 - def _on_add_button_pressed(self, event):
467 if not self.new_callback(): 468 return 469 if self.refresh_callback is None: 470 return 471 wx.BeginBusyCursor() 472 try: 473 self.refresh_callback(lctrl = self._LCTRL_items) 474 finally: 475 wx.EndBusyCursor()
476 #------------------------------------------------------------
477 - def _on_edit_button_pressed(self, event):
478 item = self._LCTRL_items.get_selected_item_data(only_one=True) 479 if item is None: 480 return 481 if not self.edit_callback(item): 482 return 483 if self.refresh_callback is None: 484 return 485 wx.BeginBusyCursor() 486 try: 487 self.refresh_callback(lctrl = self._LCTRL_items) 488 finally: 489 wx.EndBusyCursor()
490 #------------------------------------------------------------
491 - def _on_remove_button_pressed(self, event):
492 item = self._LCTRL_items.get_selected_item_data(only_one=True) 493 if item is None: 494 return 495 if not self.delete_callback(item): 496 return 497 if self.refresh_callback is None: 498 return 499 wx.BeginBusyCursor() 500 try: 501 self.refresh_callback(lctrl = self._LCTRL_items) 502 finally: 503 wx.EndBusyCursor()
504 #------------------------------------------------------------ 505 # properties 506 #------------------------------------------------------------
507 - def _get_new_callback(self):
508 return self.__new_callback
509
510 - def _set_new_callback(self, callback):
511 self.__new_callback = callback 512 self._BTN_add.Enable(callback is not None)
513 514 new_callback = property(_get_new_callback, _set_new_callback)
515 #================================================================
516 -class cReportListCtrl(wx.ListCtrl, listmixins.ListCtrlAutoWidthMixin):
517
518 - def __init__(self, *args, **kwargs):
519 520 try: 521 kwargs['style'] = kwargs['style'] | wx.LC_REPORT 522 except KeyError: 523 kwargs['style'] = wx.LC_REPORT 524 525 self.__is_single_selection = ((kwargs['style'] & wx.LC_SINGLE_SEL) == wx.LC_SINGLE_SEL) 526 527 wx.ListCtrl.__init__(self, *args, **kwargs) 528 listmixins.ListCtrlAutoWidthMixin.__init__(self) 529 530 self.__widths = None 531 self.__data = None
532 #------------------------------------------------------------ 533 # setters 534 #------------------------------------------------------------
535 - def set_columns(self, columns=None):
536 """(Re)define the columns. 537 538 Note that this will (have to) delete the items. 539 """ 540 self.ClearAll() 541 if columns is None: 542 return 543 for idx in range(len(columns)): 544 self.InsertColumn(idx, columns[idx])
545 #------------------------------------------------------------
546 - def set_column_widths(self, widths=None):
547 """Set the column width policy. 548 549 widths = None: 550 use previous policy if any or default policy 551 widths != None: 552 use this policy and remember it for later calls 553 554 This means there is no way to *revert* to the default policy :-( 555 """ 556 # explicit policy ? 557 if widths is not None: 558 self.__widths = widths 559 for idx in range(len(self.__widths)): 560 self.SetColumnWidth(col = idx, width = self.__widths[idx]) 561 return 562 563 # previous policy ? 564 if self.__widths is not None: 565 for idx in range(len(self.__widths)): 566 self.SetColumnWidth(col = idx, width = self.__widths[idx]) 567 return 568 569 # default policy ! 570 if self.GetItemCount() == 0: 571 width_type = wx.LIST_AUTOSIZE_USEHEADER 572 else: 573 width_type = wx.LIST_AUTOSIZE 574 for idx in range(self.GetColumnCount()): 575 self.SetColumnWidth(col = idx, width = width_type)
576 #------------------------------------------------------------
577 - def set_string_items(self, items = None):
578 """All item members must be unicode()able or None.""" 579 580 self.DeleteAllItems() 581 self.__data = items 582 583 if items is None: 584 return 585 586 for item in items: 587 try: 588 item[0] 589 if not isinstance(item, basestring): 590 is_numerically_iterable = True 591 else: 592 is_numerically_iterable = False 593 except TypeError: 594 is_numerically_iterable = False 595 596 if is_numerically_iterable: 597 # cannot use errors='replace' since then 598 # None/ints/unicode strings fail to get encoded 599 col_val = unicode(item[0]) 600 row_num = self.InsertStringItem(index = sys.maxint, label = col_val) 601 for col_idx in range(1, min(self.GetColumnCount(), len(item))): 602 col_val = unicode(item[col_idx]) 603 self.SetStringItem(index = row_num, col = col_idx, label = col_val) 604 else: 605 # cannot use errors='replace' since then None/ints/unicode strings fails to get encoded 606 col_val = unicode(item) 607 row_num = self.InsertStringItem(index = sys.maxint, label = col_val)
608 #------------------------------------------------------------
609 - def set_data(self, data = None):
610 """<data must be a list corresponding to the item indices>""" 611 self.__data = data
612 #------------------------------------------------------------
613 - def set_selections(self, selections=None):
614 self.Select(0, on = 0) 615 for idx in selections: 616 self.Select(idx = idx, on = 1)
617 #self.SetItemState(idx, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) 618 #------------------------------------------------------------ 619 # getters 620 #------------------------------------------------------------
621 - def get_column_labels(self):
622 labels = [] 623 for col_idx in self.GetColumnCount(): 624 col = self.GetColumn(col = col_idx) 625 labels.append(col.GetText()) 626 return labels
627 #------------------------------------------------------------
628 - def get_item_data(self, item_idx = None):
629 if self.__data is None: # this isn't entirely clean 630 return None 631 632 return self.__data[item_idx]
633 #------------------------------------------------------------
634 - def get_selected_items(self, only_one=False):
635 636 if self.__is_single_selection or only_one: 637 return self.GetFirstSelected() 638 639 items = [] 640 idx = self.GetFirstSelected() 641 while idx != -1: 642 items.append(idx) 643 idx = self.GetNextSelected(idx) 644 645 return items
646 #------------------------------------------------------------
647 - def get_selected_item_data(self, only_one=False):
648 649 if self.__is_single_selection or only_one: 650 if self.__data is None: 651 return None 652 idx = self.GetFirstSelected() 653 if idx == -1: 654 return None 655 return self.__data[idx] 656 657 data = [] 658 if self.__data is None: 659 return data 660 idx = self.GetFirstSelected() 661 while idx != -1: 662 data.append(self.__data[idx]) 663 idx = self.GetNextSelected(idx) 664 665 return data
666 #------------------------------------------------------------
667 - def deselect_selected_item(self):
668 self.Select(idx = self.GetFirstSelected(), on = 0)
669 #================================================================ 670 # main 671 #---------------------------------------------------------------- 672 if __name__ == '__main__': 673 674 from Gnumed.pycommon import gmI18N 675 gmI18N.activate_locale() 676 gmI18N.install_domain() 677 678 #------------------------------------------------------------
679 - def test_wxMultiChoiceDialog():
680 app = wx.PyWidgetTester(size = (400, 500)) 681 dlg = wx.MultiChoiceDialog ( 682 parent = None, 683 message = 'test message', 684 caption = 'test caption', 685 choices = ['a', 'b', 'c', 'd', 'e'] 686 ) 687 dlg.ShowModal() 688 sels = dlg.GetSelections() 689 print "selected:" 690 for sel in sels: 691 print sel
692 #------------------------------------------------------------
693 - def test_get_choices_from_list():
694 695 def edit(argument): 696 print "editor called with:" 697 print argument
698 699 def refresh(lctrl): 700 choices = ['a', 'b', 'c'] 701 lctrl.set_string_items(choices) 702 703 app = wx.PyWidgetTester(size = (200, 50)) 704 chosen = get_choices_from_list ( 705 # msg = 'select a health issue\nfrom the list below\n', 706 caption = 'select health issues', 707 #choices = [['D.M.II', '4'], ['MS', '3'], ['Fraktur', '2']], 708 #columns = ['issue', 'no of episodes'] 709 columns = ['issue'], 710 refresh_callback = refresh 711 #, edit_callback = edit 712 ) 713 print "chosen:" 714 print chosen 715 #------------------------------------------------------------ 716 if (len(sys.argv) > 1) and (sys.argv[1] == 'test'): 717 test_get_choices_from_list() 718 #test_wxMultiChoiceDialog() 719 720 #================================================================ 721 # 722