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