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
Post a Comment