source: sasview/sansguiframe/src/sans/guiframe/data_processor.py @ 3bc6090

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 3bc6090 was 73197d0, checked in by Gervaise Alina <gervyh@…>, 13 years ago

working on batch gui

  • Property mode set to 100644
File size: 25.5 KB
Line 
1"""
2Implement grid used to store data
3"""
4import wx
5import numpy
6import math
7import re
8import sys
9import copy
10from wx.lib.scrolledpanel import ScrolledPanel
11import  wx.grid as  Grid
12import wx.aui
13from wx.aui import AuiNotebook as nb
14from sans.guiframe.panel_base import PanelBase
15import wx.lib.sheet as sheet
16
17from sans.guiframe.events import NewPlotEvent
18from sans.guiframe.events import StatusEvent 
19from sans.guiframe.dataFitting import Data1D
20
21FUNC_DICT = {"sqrt": "math.sqrt",
22             "pow": "math.sqrt"}
23
24
25
26def parse_string(sentence, list):
27    """
28    Return a dictionary of column label and index or row selected
29    :param sentence: String to parse
30    :param list: list of columns label
31    """
32    toks = []
33    p2 = re.compile(r'\d+')
34    p = re.compile(r'[\+\-\*\%\/]')
35    labels = p.split(sentence)
36    col_dict = {}
37    for elt in labels:
38        rang = None
39        temp_arr = []
40        for label in  list:
41            label_pos =  elt.find(label)
42            if label_pos != -1:
43                if elt.count(',') > 0:
44                    new_temp = []
45                    temp = elt.split(label)
46                    for item in temp:
47                        range_pos = item.find(":")
48                        if range_pos != -1:
49                            rang = p2.findall(item)
50                            for i in xrange(int(rang[0]), int(rang[1])+1 ):
51                                new_temp.append(i)
52                    temp_arr += new_temp
53                else:
54                    temp = elt.split(label)
55                    for item in temp:
56                        range_pos = item.find(":")
57                        if range_pos != -1:
58                            rang = p2.findall(item)
59                            for i in xrange(int(rang[0]), int(rang[1])+1 ):
60                                temp_arr.append(i)
61                col_dict[elt] = (label, temp_arr)
62    return col_dict
63
64class GridPage(sheet.CSheet):
65    """
66    """
67    def __init__(self, parent, panel=None):
68        """
69        """
70        sheet.CSheet.__init__(self, parent)
71        self.SetLabelBackgroundColour('#DBD4D4')
72        self.AutoSize()
73        self.panel = panel
74        self.col_names = []
75        self._cols = 50
76        self._rows = 51
77        col_with = 30
78        row_height = 20
79        self.axis_value = []
80        self.axis_label = ""
81        self.selected_cells = []
82        self.selected_cols = []
83        self.SetColMinimalAcceptableWidth(col_with)
84        self.SetRowMinimalAcceptableHeight(row_height)
85        self.SetNumberRows(self._cols)
86        self.SetNumberCols(self._rows)
87        self.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.on_left_click)
88        self.Bind(wx.grid.EVT_GRID_LABEL_RIGHT_CLICK, self.on_right_click)
89        self.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.on_selected_cell)
90       
91    def on_selected_cell(self, event):
92        """
93        Handler catching cell selection
94        """
95        flag = event.CmdDown() or event.ControlDown()
96        row, col = event.GetRow(), event.GetCol()
97        cell = (row, col)
98        if not flag:
99            self.selected_cells = []
100            self.axis_value = []
101            self.axis_label = ""
102        if cell in self.selected_cells:
103            self.selected_cells.remove(cell)
104        else:
105            self.selected_cells.append(cell)
106        if row > 1:
107            if (cell) in self.selected_cells:
108                self.axis_value.append(self.GetCellValue(row, col))
109        self.axis_label = self.GetCellValue(row, col)
110        event.Skip()
111     
112    def on_left_click(self, event):
113        """
114        Catch the left click on label mouse event
115        """
116        flag = event.CmdDown() or event.ControlDown()
117        col = event.GetCol()
118        if not flag:
119            self.selected_cols = []
120            self.axis_value = []
121            self.axis_label = ""
122        if col not in self.selected_cols:
123            self.selected_cols.append(col)
124        if not flag :
125            for row in range(2, self.GetNumberRows()+ 1):
126                self.axis_value.append(self.GetCellValue(row, col))
127            row = 1
128            self.axis_label = self.GetCellValue(row, col)
129        event.Skip()
130       
131    def on_right_click(self, event):
132        """
133        Catch the right click mouse
134        """
135        col = event.GetCol()
136        if col != -1 and len(self.col_names) > col:
137            label = self.col_names[int(col)]
138            self.axis_label = label
139            if label in self.data.keys():
140                col_val = self.data[label]
141                self.axis_value = col_val
142        # Slicer plot popup menu
143        slicerpop = wx.Menu()
144        id = wx.NewId()
145        slicerpop.Append(id, '&Set X axis', 'Set X axis')
146        wx.EVT_MENU(self, id, self.on_set_x_axis)
147       
148        id = wx.NewId()
149        slicerpop.Append(id, '&Set Y axis', 'Set Y axis')
150        wx.EVT_MENU(self, id, self.on_set_y_axis)
151        pos = event.GetPosition()
152        pos = self.ScreenToClient(pos)
153        self.PopupMenu(slicerpop, pos)
154       
155    def on_set_x_axis(self, event):
156        """
157        """
158        self.panel.set_xaxis(x=self.axis_value, label=self.axis_label)
159   
160    def on_set_y_axis(self, event):
161        """
162        """
163        self.panel.set_yaxis(y=self.axis_value, label=self.axis_label)     
164           
165    def set_data(self, data):
166        """
167        Add data to the grid
168        """
169        if data is None:
170            data = {}
171        if  len(data) > 0:
172            self._cols = self.GetNumberCols()
173            self._rows = self.GetNumberRows()
174            self.data = data
175            self.col_names = data.keys()
176            self.col_names.sort() 
177            nbr_user_cols = len(self.col_names)
178            #Add more columns to the grid if necessary
179            if nbr_user_cols > self._cols:
180                new_col_nbr = nbr_user_cols -  self._cols
181                self.AppendCols(new_col_nbr, True)
182            #Add more rows to the grid if necessary 
183            nbr_user_row = len(self.data.values())
184            if nbr_user_row > self._rows + 1:
185                new_row_nbr =  nbr_user_row - self._rows
186                self.AppendRows(new_row_nbr, True)
187            # add data to the grid   
188            row = 0
189            for index  in range(nbr_user_cols):
190                col = index
191                # use the first row of the grid to add user defined labels
192                self.SetCellValue(row, col, str(self.col_names[index]))
193            col = 0
194            for value_list in self.data.values():
195                row = 1
196                for index in range(len(value_list)):
197                    self.SetCellValue(row, col, str(value_list[index]))
198                    row += 1
199                col += 1
200            self.AutoSize()
201           
202
203class Notebook(nb, PanelBase):
204    """
205    ## Internal name for the AUI manager
206    window_name = "Fit panel"
207    ## Title to appear on top of the window
208    """
209    window_caption = "Notebook "
210   
211    def __init__(self, parent, manager=None, data=None, *args, **kwargs):
212        """
213        """
214        nb.__init__(self, parent, -1,
215                    style= wx.aui.AUI_BUTTON_DOWN|
216                    wx.aui.AUI_NB_WINDOWLIST_BUTTON|
217                    wx.aui.AUI_NB_DEFAULT_STYLE|
218                    wx.CLIP_CHILDREN)
219        PanelBase.__init__(self, parent)
220        self.enable_close_button()
221        self.parent = parent
222        self.manager = manager
223        self.data = data
224        self.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.on_close_page)
225   
226    def enable_close_button(self):
227        """
228        display the close button on tab for more than 1 tabs else remove the
229        close button
230        """
231        if self.GetPageCount() <= 1:
232            style = self.GetWindowStyleFlag() 
233            flag = wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB
234            if style & wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB == flag:
235                style = style & ~wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB
236                self.SetWindowStyle(style)
237        else:
238            style = self.GetWindowStyleFlag()
239            flag = wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB
240            if style & wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB != flag:
241                style |= wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB
242                self.SetWindowStyle(style)
243             
244    def on_edit_axis(self):
245        """
246        Return the select cell of a given selected column
247        """
248        pos = self.GetSelection()
249        grid = self.GetPage(pos)
250        if len(grid.selected_cols) > 1:
251            msg = "Edit axis doesn't understand this selection.\n"
252            msg += "Please select only one column"
253            raise ValueError, msg
254        list_of_cells = []
255        if len(grid.selected_cols) == 1:
256            col = grid.selected_cols[0]
257            if len(grid.selected_cells) > 0:
258                cell_row, cell_col = grid.selected_cells[0]
259                if cell_col  != col:
260                    msg = "Edit axis doesn't understand this selection.\n"
261                    msg += "Please select element of the same col"
262                    raise ValueError, msg
263            for row in range(grid.GetNumberRows()):
264                list_of_cells.append((row + 1 , col))
265            for item in grid.selected_cells:
266                if item in list_of_cells:
267                    list_of_cells.remove(item)
268        elif len(grid.selected_cols) == 0:
269            list_of_cells = [(row + 1, col) for row, col in grid.selected_cells]
270        return list_of_cells
271   
272    def get_column_labels(self):
273        """
274        return dictionary of columns labels of the current page
275        """
276        pos = self.GetSelection()
277        grid = self.GetPage(pos)
278        labels = {}
279        row = 0
280        for col in range(grid.GetNumberCols()):
281            label = grid.GetCellValue(row, col)
282            if label.strip() != "" :
283                labels[label.strip()] = col
284        return labels
285       
286    def create_axis_label(self, cell_list):
287        """
288        Receive a list of cells and  create a string presenting the selected
289        cells.
290        :param cell_list: list of tuple
291       
292        """
293        pos = self.GetSelection()
294        grid = self.GetPage(pos)
295        label = ""
296        col_name = ""
297        if len(cell_list) > 0:
298            temp_list = copy.deepcopy(cell_list)
299            temp_list.sort()
300            temp = []
301            for item in temp_list:
302                if item[0] <= 1:
303                    temp.append(item)
304            for element in temp:
305                temp_list.remove(element)
306            row_min, col  = temp_list[0]   
307            row_max = row_min
308            col_name = grid.GetCellValue(0, col)
309            label += str(col_name) + "[" + str(row_min) + ":"
310            for index in xrange(len(temp_list)):
311                prev = index - 1
312                row, _ = temp_list[index]
313                if row > row_max + 1 :
314                    if prev > 0:
315                        row_max, _ = temp_list[prev]
316                        label += str(row_max) + "]" + ","
317                        row_min = row
318                        label  += "[" + str(row_min) + ":"
319                row_max = row
320                if (index == len(temp_list)- 1):
321                    label +=  str(row_max) + "]"     
322        return label, col_name
323   
324    def on_close_page(self, event):
325        """
326        close the page
327        """
328        if self.GetPageCount() == 1:
329            event.Veto()
330        self.enable_close_button()
331       
332    def set_data(self, data):
333        if data is None:
334            return
335           
336        grid = GridPage(self, panel=self.parent)
337        grid.set_data(data) 
338        self.AddPage(grid, "")
339        pos = self.GetPageIndex(grid)
340        title = "Batch " + str(self.GetPageCount())
341        self.SetPageText(pos, title)
342       
343    def add_column(self):
344        """
345        Append a new column to the grid
346        """
347        pos = self.GetSelection()
348        grid = self.GetPage(pos)
349        grid.AppendCols(1, True)
350       
351    def on_remove_column(self):
352        """
353        Remove column to the current grid
354        """
355        pos = self.GetSelection()
356        grid = self.GetPage(pos)
357        cols_pos = grid.GetSelectedCols() 
358        for cpos in cols_pos:
359            grid.DeleteCols(cpos)
360         
361         
362class SPanel(ScrolledPanel):
363    def __init__(self, parent, *args, **kwds):
364        ScrolledPanel.__init__(self, parent , *args, **kwds)
365        self.SetupScrolling() 
366
367
368class GridPanel(SPanel):
369    def __init__(self, parent, data=None, *args, **kwds):
370        SPanel.__init__(self, parent , *args, **kwds)
371        self.vbox = wx.BoxSizer(wx.VERTICAL)
372       
373        self.plotting_sizer = wx.FlexGridSizer(3, 7, 10, 5)
374        self.grid_sizer = wx.BoxSizer(wx.HORIZONTAL)
375        self.vbox.AddMany([(self.grid_sizer, 1, wx.EXPAND, 0),
376                           (wx.StaticLine(self, -1), 0, wx.EXPAND, 0),
377                           (self.plotting_sizer)])
378        self.parent = parent
379        self._data = data
380        self.x = []
381        self.= []
382        self.x_axis_label = None
383        self.y_axis_label = None
384        self.x_axis_title = None
385        self.y_axis_title = None
386        self.x_axis_unit = None
387        self.y_axis_unit = None
388        self.plot_button = None
389        self.notebook = None
390        self.layout_grid()
391        self.layout_plotting_area()
392        self.SetSizer(self.vbox)
393       
394    def set_data(self, data):
395        """
396        """
397        if self.notebook is not None:
398            self.notebook.set_data(data)
399       
400    def set_xaxis(self, label="", x=None):
401        """
402        """
403        if x is None:
404            x = []
405        self.x = x
406        self.x_axis_label.SetValue("%s[:]" % str(label))
407        self.x_axis_title.SetValue(str(label))
408       
409    def set_yaxis(self, label="", y=None):
410        """
411        """
412        if y is None:
413            y = []
414        self.y = y
415        self.y_axis_label.SetValue("%s[:]" % str(label))
416        self.y_axis_title.SetValue(str(label))
417       
418    def get_plot_axis(self, col, list):
419        """
420       
421        """
422        axis = []
423        pos = self.notebook.GetSelection()
424        grid = self.notebook.GetPage(pos)
425        for row in list:
426            label = grid.GetCellValue(row - 1, col)
427            if label.strip() != "":
428                axis.append(float(label.strip()))
429        return axis
430   
431    def on_plot(self, event):
432        """
433        Evaluate the contains of textcrtl and plot result
434        """ 
435        pos = self.notebook.GetSelection()
436        grid = self.notebook.GetPage(pos)
437        column_names = {}
438        if grid is not None:
439            column_names = self.notebook.get_column_labels()
440        #evalue x
441        sentence = self.x_axis_label.GetValue()
442        if sentence.strip() == "":
443            msg = "select value for x axis"
444            raise ValueError, msg
445        dict = parse_string(sentence, column_names.keys())
446        for tok, (col_name, list) in dict.iteritems():
447            col = column_names[col_name]
448            xaxis = self.get_plot_axis(col, list)
449            sentence = sentence.replace(tok, 
450                                        "numpy.array(%s)" % str(xaxis))
451        for key, value in FUNC_DICT.iteritems():
452            sentence = sentence.replace(key.lower(), value)
453        x = eval(sentence)
454        #evaluate y
455        sentence = self.y_axis_label.GetValue()
456        if sentence.strip() == "":
457            msg = "select value for y axis"
458            raise ValueError, msg
459        dict = parse_string(sentence, column_names.keys())
460        for tok, (col_name, list) in dict.iteritems():
461            col = column_names[col_name]
462            yaxis = self.get_plot_axis(col, list)
463            sentence = sentence.replace(tok, 
464                                        "numpy.array(%s)" % str(yaxis))
465        for key, value in FUNC_DICT.iteritems():
466            sentence = sentence.replace(key, value)
467        y = eval(sentence)
468        #plotting
469        new_plot = Data1D(x=x, y=y)
470        new_plot.id =  wx.NewId()
471        new_plot.group_id = wx.NewId()
472        title = "%s vs %s" % (self.y_axis_title.GetValue(), 
473                              self.x_axis_title.GetValue())
474        new_plot.xaxis(self.x_axis_title.GetValue(), self.x_axis_unit.GetValue())
475        new_plot.yaxis(self.y_axis_title.GetValue(), self.y_axis_unit.GetValue())
476        try:
477            title = self.notebook.GetPageText(pos)
478            wx.PostEvent(self.parent.parent, 
479                             NewPlotEvent(plot=new_plot, 
480                        group_id=str(new_plot.group_id), title =title))   
481        except:
482            pass
483       
484    def layout_grid(self):
485        """
486        Draw the area related to the grid
487        """
488        self.notebook = Notebook(parent=self)
489        self.notebook.set_data(self._data)
490        self.grid_sizer.Add(self.notebook, 1, wx.EXPAND, 0)
491       
492    def layout_plotting_area(self):
493        """
494        Draw area containing options to plot
495        """
496        self.x_axis_title = wx.TextCtrl(self, -1)
497        self.y_axis_title = wx.TextCtrl(self, -1)
498        self.x_axis_label = wx.TextCtrl(self, -1, size=(200, -1))
499        self.y_axis_label = wx.TextCtrl(self, -1, size=(200, -1))
500        self.x_axis_add = wx.Button(self, -1, "Add")
501        self.x_axis_add.Bind(event=wx.EVT_BUTTON, handler=self.on_edit_axis, 
502                            id=self.x_axis_add.GetId())
503        self.y_axis_add = wx.Button(self, -1, "Add")
504        self.y_axis_add.Bind(event=wx.EVT_BUTTON, handler=self.on_edit_axis, 
505                            id=self.y_axis_add.GetId())
506        self.x_axis_unit = wx.TextCtrl(self, -1)
507        self.y_axis_unit = wx.TextCtrl(self, -1)
508        self.plot_button = wx.Button(self, -1, "Plot")
509        wx.EVT_BUTTON(self, self.plot_button.GetId(), self.on_plot)
510        self.plotting_sizer.AddMany([
511                    (wx.StaticText(self, -1, "x-axis label"), 1,
512                      wx.TOP|wx.BOTTOM|wx.LEFT, 10),
513                    (self.x_axis_label, 1, wx.TOP|wx.BOTTOM, 10),
514                    (self.x_axis_add, 1, wx.TOP|wx.BOTTOM|wx.RIGHT, 10),
515                    (wx.StaticText(self, -1, "x-axis title"), 1, 
516                     wx.TOP|wx.BOTTOM|wx.LEFT, 10),
517                    (self.x_axis_title, 1, wx.TOP|wx.BOTTOM, 10),
518                    (wx.StaticText(self, -1 , "unit"), 1, 
519                     wx.TOP|wx.BOTTOM, 10),
520                    (self.x_axis_unit, 1, wx.TOP|wx.BOTTOM, 10),
521                    (wx.StaticText(self, -1, "y-axis label"), 1, 
522                     wx.BOTTOM|wx.LEFT, 10),
523                    (self.y_axis_label, wx.BOTTOM, 10),
524                    (self.y_axis_add, 1, wx.BOTTOM|wx.RIGHT, 10),
525                    (wx.StaticText(self, -1, "y-axis title"), 1, 
526                     wx.BOTTOM|wx.LEFT, 10),
527                    (self.y_axis_title,  wx.BOTTOM, 10),
528                    (wx.StaticText(self, -1 , "unit"), 1, wx.BOTTOM, 10),
529                    (self.y_axis_unit, 1, wx.BOTTOM, 10),
530                      (-1, -1),
531                      (-1, -1),
532                      (-1, -1),
533                      (-1, -1),
534                      (-1, -1),
535                      (-1, -1),
536                      (self.plot_button, 1, wx.LEFT|wx.BOTTOM, 10)])
537   
538    def on_edit_axis(self, event):
539        """
540        Get the selected column on  the visible grid and set values for axis
541        """
542        cell_list = self.notebook.on_edit_axis()
543        label, title = self.create_axis_label(cell_list)
544        tcrtl = event.GetEventObject()
545        if tcrtl == self.x_axis_add:
546            self.edit_axis_helper(self.x_axis_label, self.x_axis_title,
547                                   label, title)
548        elif tcrtl == self.y_axis_add:
549            self.edit_axis_helper(self.y_axis_label, self.y_axis_title,
550                                   label, title)
551           
552    def create_axis_label(self, cell_list):
553        """
554        Receive a list of cells and  create a string presenting the selected
555        cells.
556        :param cell_list: list of tuple
557       
558        """
559        if self.notebook is not None:
560            return self.notebook.create_axis_label(cell_list)
561   
562    def edit_axis_helper(self, tcrtl_label, tcrtl_title, label, title):
563        """
564        get controls to modify
565        """
566        tcrtl_label.SetValue(str(label))
567        tcrtl_title.SetValue(str(title))
568       
569    def add_column(self):
570        """
571        """
572        if self.notebook is not None:
573            self.notebook.add_column()
574       
575    def on_remove_column(self):
576        """
577        """
578        if self.notebook is not None:
579            self.notebook.on_remove_column()
580       
581       
582class GridFrame(wx.Frame):
583    def __init__(self, parent=None, data=None, id=-1, 
584                 title="Batch Results", size=(700, 400)):
585        wx.Frame.__init__(self, parent=parent, id=id, title=title, size=size)
586        self.parent = parent
587        self.panel = GridPanel(self, data)
588        menubar = wx.MenuBar()
589        self.SetMenuBar(menubar)
590        edit = wx.Menu()
591        menubar.Append(edit, "&Edit")
592        self.Bind(wx.EVT_CLOSE, self.on_close)
593       
594        add_col_menu = edit.Append(wx.NewId(), 'Add Column', 'Add column')
595        wx.EVT_MENU(self, add_col_menu.GetId(), self.on_add_column)
596        remove_col_menu = edit.Append(wx.NewId(), 'Remove Column', 
597                                      'Remove Column')
598        wx.EVT_MENU(self, remove_col_menu.GetId(), self.on_remove_column)
599
600    def on_close(self, event):
601        """
602        """
603        self.Hide()
604       
605    def on_remove_column(self, event):
606        """
607        Remove the selected column to the grid
608        """
609        self.panel.on_remove_column()
610       
611    def on_add_column(self, event):
612        """
613        Append a new column to the grid
614        """
615        self.panel.add_column()
616       
617    def set_data(self, data):
618        """
619        """
620        self.panel.set_data(data)
621     
622     
623class BatchOutputDialog(wx.Dialog):
624    """
625    Allow to select where the result of batch will be displayed or stored
626    """
627    def __init__(self, parent=None, data=None, *args, **kwds):
628        """
629        :param parent: Window instantiating this dialog
630        :param result: result to display in a grid or export to an external
631                application.
632        """
633        kwds['style'] = wx.CAPTION|wx.SYSTEM_MENU
634        wx.Dialog.__init__(self, parent, *args, **kwds)
635        self.parent = parent
636        self.data = data
637        self.flag = 1
638        self.SetSize((300, 200))
639        self.local_app_selected = None
640        self.external_app_selected = None
641        self.save_to_file = None
642        self._do_layout()
643
644    def _do_layout(self):
645        """
646        Draw the content of the current dialog window
647        """
648        vbox = wx.BoxSizer(wx.VERTICAL)
649        box_description= wx.StaticBox(self, -1,str("Batch Outputs"))
650        hint_sizer = wx.StaticBoxSizer(box_description, wx.VERTICAL)
651        selection_sizer = wx.GridBagSizer(5,5)
652        button_sizer = wx.BoxSizer(wx.HORIZONTAL)
653        text = "Open with SansView"
654        self.local_app_selected = wx.RadioButton(self, -1, text,
655                                                style=wx.RB_GROUP)
656        self.Bind(wx.EVT_RADIOBUTTON, self.onselect,
657                    id=self.local_app_selected.GetId())
658        text = "Open with Excel"
659        self.external_app_selected  = wx.RadioButton(self, -1, text)
660        self.Bind(wx.EVT_RADIOBUTTON, self.onselect,
661                    id=self.external_app_selected.GetId())
662        text = "Save to file"
663        self.save_to_file = wx.CheckBox(self, -1, text)
664        self.Bind(wx.EVT_CHECKBOX, self.onselect,
665                    id=self.save_to_file.GetId())
666        self.local_app_selected.SetValue(True)
667        self.external_app_selected.SetValue(False)
668        self.save_to_file.SetValue(False)
669 
670        button_OK = wx.Button(self, wx.ID_OK, "Ok")
671        button_OK.SetFocus()
672        hint = ""
673        hint_sizer.Add(wx.StaticText(self, -1, hint))
674        hint_sizer.Add(selection_sizer)
675        #draw area containing radio buttons
676        ix = 0
677        iy = 0
678        selection_sizer.Add(self.local_app_selected, (iy, ix),
679                           (1, 1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
680        iy += 1
681        selection_sizer.Add(self.external_app_selected, (iy, ix),
682                           (1, 1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
683        iy += 1
684        selection_sizer.Add(self.save_to_file, (iy, ix),
685                           (1, 1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
686        #contruction the sizer contaning button
687        button_sizer.Add((20, 20), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
688        button_sizer.Add(button_OK, 0,
689                                wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
690        vbox.Add(hint_sizer,  0, wx.EXPAND|wx.ALL, 10)
691        vbox.Add(wx.StaticLine(self, -1),  0, wx.EXPAND, 0)
692        vbox.Add(button_sizer, 0 , wx.TOP|wx.BOTTOM, 10)
693        self.SetSizer(vbox)
694       
695    def onselect(self, event=None):
696        """
697        Receive event and display data into third party application
698        or save data to file.
699       
700        """
701        if self.save_to_file.GetValue():
702            self.flag = 3
703            if self.parent is not None and  self.data is not None:
704                self.parent.save_batch_into_file(self.data)
705        elif self.local_app_selected.GetValue():
706            self.flag = 1
707        else:
708            self.flag = 2
709        return self.flag
710   
711 
712       
713if __name__ == "__main__":
714    app = wx.App()
715   
716    try:
717        data = {}
718        j = 0
719        for i in range(4):
720            j += 1
721            data["index"+str(i)] = [i/j, i*j, i, i+j]
722           
723        frame = GridFrame(data=data)
724        frame.Show(True)
725    except:
726        print sys.exc_value
727       
728    app.MainLoop()
Note: See TracBrowser for help on using the repository browser.