pylint(1) fixes for GUI
authorAlexander Vasarab <alexander@wylark.com>
Mon, 29 Jun 2020 20:01:12 +0000 (13:01 -0700)
committerAlexander Vasarab <alexander@wylark.com>
Mon, 29 Jun 2020 20:01:12 +0000 (13:01 -0700)
munter/gui.py

index 87ccd081dfb0ef5775b47b152f4bdfdd83624a8b..50ee5d5e16b17d4a69e2ee1df25a2e91486eea84 100644 (file)
@@ -14,26 +14,45 @@ class MainFrame(wx.Frame):
     """
     The main wx.Frame
     """
+    program_name = ""
 
     def __init__(self, *args, **kw):
+        """add to the init process for the wx.Frame"""
         super(MainFrame, self).__init__(*args, **kw)
 
+        # initial setup
         self.SetTitle(progname)
         self.SetSize(600, 400)
 
         self.props = self.init_props()
-
         self.pnl = wx.Panel(self)
 
-        st = wx.StaticText(self.pnl, label=progname)
-        font = st.GetFont()
+        # setup the GUI itself
+        self.create_wx_items()
+        self.establish_wx_bindings()
+        self.do_wx_layout()
+        self.update_mtc()
+
+    # init routines
+    def init_props(self):
+        """centralized place to initialize props var"""
+        props = dict()
+        props['distance'] = 0
+        props['elevation'] = 0
+        props['fitness'] = 'average'
+        props['units'] = 'imperial'
+        props['travel_mode'] = 'uphill'
+        return props
+
+    def create_wx_items(self):
+        """create wxPython items"""
+        # title bar / program name
+        self.program_name = wx.StaticText(self.pnl, label=progname)
+        font = self.program_name.GetFont()
         font.PointSize += 10
         font = font.Bold()
 
-        st.SetFont(font)
-
-        sizer = wx.BoxSizer(wx.HORIZONTAL)
-        sizer.Add(st, wx.SizerFlags().Border(wx.TOP|wx.LEFT, 0))
+        self.program_name.SetFont(font)
 
         # text entry fields
         self.st_distance = wx.StaticText(self.pnl, label="Distance: ", style=wx.ALIGN_RIGHT)
@@ -42,187 +61,193 @@ class MainFrame(wx.Frame):
         self.st_elevation = wx.StaticText(self.pnl, label="Elevation: ", style=wx.ALIGN_RIGHT)
         self.te_elevation = wx.TextCtrl(self.pnl, value="0", size=(140, -1))
 
-        self.st_fitness   = wx.StaticText(self.pnl, label="Fitness: ", style=wx.ALIGN_RIGHT)
+        self.st_fitness = wx.StaticText(self.pnl, label="Fitness: ", style=wx.ALIGN_RIGHT)
         rb_fitness_choices = ['slow', 'average', 'fast']
         rb_fitness_default = 'average'
-        self.rb_fitness   = wx.ComboBox(self.pnl, choices=rb_fitness_choices,
-                value=rb_fitness_default, style=wx.CB_READONLY)
+        self.rb_fitness = wx.ComboBox(self.pnl, choices=rb_fitness_choices,
+                                      value=rb_fitness_default,
+                                      style=wx.CB_READONLY)
 
-        self.st_travel_mode    = wx.StaticText(self.pnl, label="Travel Mode: ", style=wx.ALIGN_RIGHT)
+        self.st_travel_mode = wx.StaticText(self.pnl,
+                                            label="Travel Mode: ",
+                                            style=wx.ALIGN_RIGHT)
         rb_travel_mode_choices = ['uphill', 'flat', 'downhill', 'bushwhacking']
         rb_travel_mode_default = 'uphill'
-        self.rb_travel_mode    = wx.ComboBox(self.pnl,
-            choices=rb_travel_mode_choices,
-            value=rb_travel_mode_default, style=wx.CB_READONLY)
+        self.rb_travel_mode = wx.ComboBox(self.pnl,
+                                          choices=rb_travel_mode_choices,
+                                          value=rb_travel_mode_default,
+                                          style=wx.CB_READONLY)
 
-        self.st_units   = wx.StaticText(self.pnl, label="Units: ", style=wx.ALIGN_RIGHT)
+        self.st_units = wx.StaticText(self.pnl, label="Units: ", style=wx.ALIGN_RIGHT)
         rb_units_choices = ['imperial', 'metric']
         rb_units_default = 'imperial'
 
         self.rb_units = []
-        for choice in range(len(rb_units_choices)):
-            label = rb_units_choices[choice]
-            style = wx.RB_GROUP if not choice else 0
+        for choice in rb_units_choices:
+            label = choice
+            style = wx.RB_GROUP if choice == rb_units_default else 0
             self.rb_units.append(wx.RadioButton(self.pnl, label=label, style=style))
 
         # static text
         self.st_mtc = wx.StaticText(self.pnl, label="",
-                style=wx.ALIGN_CENTRE_HORIZONTAL)
+                                    style=wx.ALIGN_CENTRE_HORIZONTAL)
 
-        st_mtc_font = st.GetFont()
+        st_mtc_font = self.program_name.GetFont()
         st_mtc_font.PointSize += 10
         self.st_mtc.SetFont(st_mtc_font)
 
         # buttons
         self.b_reset = wx.Button(self.pnl, wx.NewId(), '&Reset', (-1, -1),
-                wx.DefaultSize)
+                                 wx.DefaultSize)
 
-        # bindings
+    def establish_wx_bindings(self):
+        """establish wxPython bindings"""
         self.pnl.Bind(wx.EVT_TEXT, self.update_distance, self.te_distance)
         self.pnl.Bind(wx.EVT_TEXT, self.update_elevation, self.te_elevation)
         self.rb_fitness.Bind(wx.EVT_COMBOBOX, self.update_fitness)
         self.rb_travel_mode.Bind(wx.EVT_COMBOBOX, self.update_travel_mode)
         self.b_reset.Bind(wx.EVT_BUTTON, self.reset)
 
-        for cb in self.rb_units:
-            cb.Bind(wx.EVT_RADIOBUTTON, self.update_units)
+        for rb_unit in self.rb_units:
+            rb_unit.Bind(wx.EVT_RADIOBUTTON, self.update_units)
 
-        # layout
-        b = 5
-        w = 100
+    def do_wx_layout(self):
+        """layout the wxPython items"""
+        border = 5
+        width = 100
+
+        sizer = wx.BoxSizer(wx.HORIZONTAL)
+        sizer.Add(self.program_name, wx.SizerFlags().Border(wx.TOP|wx.LEFT, 0))
 
         static_line = wx.StaticLine(self.pnl, wx.NewId(), style=wx.LI_HORIZONTAL)
 
         hsizer_distance = wx.BoxSizer(wx.HORIZONTAL)
-        hsizer_distance.Add(self.st_distance, 0, wx.RIGHT, b)
-        hsizer_distance.Add(self.te_distance, 1, wx.GROW, b)
-        hsizer_distance.SetItemMinSize(self.st_distance, (w, -1))
+        hsizer_distance.Add(self.st_distance, 0, wx.RIGHT, border)
+        hsizer_distance.Add(self.te_distance, 1, wx.GROW, border)
+        hsizer_distance.SetItemMinSize(self.st_distance, (width, -1))
 
         hsizer_elevation = wx.BoxSizer(wx.HORIZONTAL)
-        hsizer_elevation.Add(self.st_elevation, 0, wx.RIGHT, b)
-        hsizer_elevation.Add(self.te_elevation, 1, wx.GROW, b)
-        hsizer_elevation.SetItemMinSize(self.st_elevation, (w, -1))
+        hsizer_elevation.Add(self.st_elevation, 0, wx.RIGHT, border)
+        hsizer_elevation.Add(self.te_elevation, 1, wx.GROW, border)
+        hsizer_elevation.SetItemMinSize(self.st_elevation, (width, -1))
 
         hsizer_fitness = wx.BoxSizer(wx.HORIZONTAL)
-        hsizer_fitness.Add(self.st_fitness, 0, wx.RIGHT, b)
-        hsizer_fitness.Add(self.rb_fitness, 1, wx.GROW, b)
-        hsizer_fitness.SetItemMinSize(self.st_fitness, (w, -1))
+        hsizer_fitness.Add(self.st_fitness, 0, wx.RIGHT, border)
+        hsizer_fitness.Add(self.rb_fitness, 1, wx.GROW, border)
+        hsizer_fitness.SetItemMinSize(self.st_fitness, (width, -1))
 
         hsizer_travel_mode = wx.BoxSizer(wx.HORIZONTAL)
-        hsizer_travel_mode.Add(self.st_travel_mode, 0, wx.RIGHT, b)
-        hsizer_travel_mode.Add(self.rb_travel_mode, 1, wx.GROW, b)
-        hsizer_travel_mode.SetItemMinSize(self.st_travel_mode, (w, -1))
+        hsizer_travel_mode.Add(self.st_travel_mode, 0, wx.RIGHT, border)
+        hsizer_travel_mode.Add(self.rb_travel_mode, 1, wx.GROW, border)
+        hsizer_travel_mode.SetItemMinSize(self.st_travel_mode, (width, -1))
 
         hsizer_units = wx.BoxSizer(wx.HORIZONTAL)
-        hsizer_units.Add(self.st_units, 0, wx.RIGHT, b)
-        for cb in range(len(self.rb_units)):
-            hsizer_units.Add(self.rb_units[cb], cb + 1, wx.GROW, b)
-        hsizer_units.SetItemMinSize(self.st_units, (w, -1))
+        hsizer_units.Add(self.st_units, 0, wx.RIGHT, border)
+        for rb_unit in range(len(self.rb_units)):
+            hsizer_units.Add(self.rb_units[rb_unit], rb_unit + 1, wx.GROW, border)
+        hsizer_units.SetItemMinSize(self.st_units, (width, -1))
 
         hsizer_mtc = wx.BoxSizer(wx.HORIZONTAL)
-        hsizer_mtc.Add(self.st_mtc, 1, wx.GROW, b)
-        hsizer_mtc.SetItemMinSize(self.st_mtc, (w, -1))
+        hsizer_mtc.Add(self.st_mtc, 1, wx.GROW, border)
+        hsizer_mtc.SetItemMinSize(self.st_mtc, (width, -1))
 
         hsizer5 = wx.BoxSizer(wx.HORIZONTAL)
         hsizer5.Add(self.b_reset, 0)
 
-        b = 5
         vsizer1 = wx.BoxSizer(wx.VERTICAL)
-        vsizer1.Add(sizer, 0, wx.EXPAND | wx.ALL, b*b)
-        vsizer1.Add(hsizer_distance, 0, wx.EXPAND | wx.ALL, b)
-        vsizer1.Add(hsizer_elevation, 0, wx.EXPAND | wx.ALL, b)
-        vsizer1.Add(hsizer_fitness, 0, wx.EXPAND | wx.ALL, b)
-        vsizer1.Add(hsizer_travel_mode, 0, wx.EXPAND | wx.ALL, b)
-        vsizer1.Add(hsizer_units, 0, wx.EXPAND | wx.ALL, b)
-        vsizer1.Add(hsizer_mtc, 0, wx.EXPAND | wx.ALL, b)
-        vsizer1.Add(static_line, 0, wx.GROW | wx.ALL, b)
-        vsizer1.Add(hsizer5, 0, wx.ALIGN_RIGHT | wx.ALL, b)
+        vsizer1.Add(sizer, 0, wx.EXPAND | wx.ALL, border*border)
+        vsizer1.Add(hsizer_distance, 0, wx.EXPAND | wx.ALL, border)
+        vsizer1.Add(hsizer_elevation, 0, wx.EXPAND | wx.ALL, border)
+        vsizer1.Add(hsizer_fitness, 0, wx.EXPAND | wx.ALL, border)
+        vsizer1.Add(hsizer_travel_mode, 0, wx.EXPAND | wx.ALL, border)
+        vsizer1.Add(hsizer_units, 0, wx.EXPAND | wx.ALL, border)
+        vsizer1.Add(hsizer_mtc, 0, wx.EXPAND | wx.ALL, border)
+        vsizer1.Add(static_line, 0, wx.GROW | wx.ALL, border)
+        vsizer1.Add(hsizer5, 0, wx.ALIGN_RIGHT | wx.ALL, border)
 
         self.pnl.SetSizerAndFit(vsizer1)
         self.pnl.SetClientSize(vsizer1.GetSize())
-        self.update_mtc()
-
-    def init_props(self):
-        props = dict()
-        props['distance'] = 0
-        props['elevation'] = 0
-        props['fitness'] = 'average'
-        props['units'] = 'imperial'
-        props['travel_mode'] = 'uphill'
-        return props
 
+    # event handlers
     def update_distance(self, event):
-        value = self.te_distance.GetValue()
+        """updates distance prop"""
+        value = event.GetEventObject().GetValue()
         if value:
             try:
                 new_val = float(value)
                 self.props['distance'] = new_val
-            except:
+            except ValueError:
                 # reset GUI to last-accepted val
                 self.te_distance.SetValue(str(self.props['distance']))
-                pass
         self.update_mtc()
 
     def update_elevation(self, event):
-        value = self.te_elevation.GetValue()
+        """updates elevation prop"""
+        value = event.GetEventObject().GetValue()
         if value:
             try:
                 new_val = int(value)
                 self.props['elevation'] = new_val
-            except:
+            except ValueError:
                 # reset GUI to last-accepted val
                 self.te_elevation.SetValue(str(self.props['elevation']))
-                pass
         self.update_mtc()
 
     def update_fitness(self, event):
-        value = self.rb_fitness.GetValue()
+        """updates fitness prop"""
+        value = event.GetEventObject().GetValue()
         if value:
             self.props['fitness'] = value
         self.update_mtc()
 
     def update_travel_mode(self, event):
-        value = self.rb_travel_mode.GetValue()
+        """updates travel_mode prop"""
+        value = event.GetEventObject().GetValue()
         if value:
             self.props['travel_mode'] = value
         self.update_mtc()
 
     def update_units(self, event):
-        rb = event.GetEventObject()
-        value = rb.GetLabel()
+        """updates units prop"""
+        value = event.GetEventObject().GetLabel()
         if value:
             self.props['units'] = value
         self.update_mtc()
 
+    def reset(self, event):
+        """resets all values"""
+        event.GetTimestamp()
+        self.props = self.init_props()
+        self.te_distance.SetValue(str(self.props['distance']))
+        self.te_elevation.SetValue(str(self.props['elevation']))
+        self.rb_fitness.SetValue(str(self.props['fitness']))
+        self.rb_travel_mode.SetValue(str(self.props['travel_mode']))
+        # leave units as the user selected
+        self.update_mtc()
+
+    # other routines
     def update_mtc(self):
+        """updates mtc, the final result the user wants"""
         if (self.props['distance'] is None) or (self.props['elevation'] is None):
             return
 
         est = munter.time_calc(self.props['distance'],
-            self.props['elevation'],
-            self.props['fitness'],
-            self.props['travel_mode'],
-            self.props['units'])
+                               self.props['elevation'],
+                               self.props['fitness'],
+                               self.props['travel_mode'],
+                               self.props['units'])
 
         hours = int(est['time'])
         minutes = int((est['time'] - hours) * 60)
         self.st_mtc.SetLabel("{human_time}".format(
-                human_time="{hours} hours {minutes} minutes".format(
-                    hours=hours,
-                    minutes=minutes)))
+            human_time="{hours} hours {minutes} minutes".format(
+                hours=hours,
+                minutes=minutes)))
 
         self.pnl.Layout()
 
-    def reset(self, event):
-        self.props = self.init_props()
-        self.te_distance.SetValue(str(self.props['distance']))
-        self.te_elevation.SetValue(str(self.props['elevation']))
-        self.rb_fitness.SetValue(str(self.props['fitness']))
-        self.rb_travel_mode.SetValue(str(self.props['travel_mode']))
-        # leave units as the user selected
-        self.update_mtc()
-
 def startup():
+    """kick off the GUI"""
     app = wx.App()
     frm = MainFrame(None)
     frm.Show()