OOP techniques with Python GUI (PySide) elements -


objective: create line item object contains textbox label, value, , value units in pyside.

background: creating control panel device run off of raspberry pi using python pyside (qtpython) handle gui. using grid layout, , have common motif trying encapsulate in class avoid repeating myself. need building class.

typically, code looks this:

class form(qdialog):     def __init__(self, parent=none):         super(form, self).__init__(parent)          self.pressure_label = qlabel('pressure:')         self.pressure_value = qlabel()         self.pressure_units = qlabel('psi')          self.temperature_label = qlabel('temperature:')         self.temperature_value = qlabel()         self.temperature_units = qlabel('oc')         ...          grid = qgridlayout()          grid.addwidget(pressure_label, 0, 0)         grid.addwidget(pressure_value, 0, 1)         grid.addwidget(pressure_units, 0, 1)          grid.addwidget(temperature_label, 1, 0)         grid.addwidget(temperature_value, 1, 1)         grid.addwidget(temperature_units, 1, 1)         ...          self.setlayout(grid)      def update(self):         self.temperature_value.settext(t_sensor.read())         self.pressure_value.settext(p_sensor.read()) 

what have tried:

with gui elements, not sure need put classes, or parent object need inherit. have tried create object in following way, framework, , won't compile.

class lineitem(object):     def __init__(self, label_text, unit_text, grid, row):         self.value = none         self.units = none          self.label_field = qlabel(label_text)         self.value_field = qlabel()         self.units_field = qlabel(unit_text)          grid.addwidget(self.label_field, row, 0)         grid.addwidget(self.value_field, row, 1)         grid.addwidget(self.units_field, row, 2)      @property     def value(self):          return self.value      @value.setter     def value(self, val):         self.value = val         self.value_field.settext(val)      @property     def units(self):         return self.value      @value.setter     def units(self, val):         self.units = val         self.units_field.settext(val)  class form(qdialog):     def __init__(self, parent=none):         grid = qgridlayout()          row_number = itertools.count()         tb_encoder_1 = lineitem('distance:', 'm', grid, next(row_number))         tb_encoder_2 = lineitem('distance:', 'm', grid, next(row_number))          self.setlayout(grid) 

what need:

what hoping encapsulate label, value, units structure class, don't have repeat myself much.

where class go? inherit? how give access grid object (does need access)?

what struggle understanding how classes , encapsulation translate pyside forms , widgets. of tutorials have seen far don't go route, put logic , creating in 1 big form(qdialog) class.

you need qwidget subclass act container other widgets. structure similar normal form - main difference end child widget of form, rather top-level window.

class lineitem(qwidget):     def __init__(self, label_text, unit_text, parent=none):         super(lineitem, self).__init__(parent)          self.label_field = qlabel(label_text)         self.value_field = qlabel()         self.units_field = qlabel(unit_text)          layout = qvboxlayout()         layout.setcontentsmargins(0, 0, 0, 0)          layout.addwidget(self.label_field)         layout.addwidget(self.value_field)         layout.addwidget(self.units_field)          self.setlayout(layout)  class form(qdialog):     def __init__(self, parent=none):         super(form, self).__init__(parent)          self.pressure_line = lineitem('pressure:', 'psi', self)         self.temperature_line = lineitem('temperature:', 'oc', self)          layout = qhboxlayout()          layout.addwidget(self.pressure_line)         layout.addwidget(self.temperature_line)          self.setlayout(layout) 

Comments

Popular posts from this blog

jOOQ update returning clause with Oracle -

java - Warning equals/hashCode on @Data annotation lombok with inheritance -

java - BasicPathUsageException: Cannot join to attribute of basic type -