Derzeit befasse ich mich im Rahmen meiner Masterarbeit mit PyQt um eine Anwendung zu schreiben, welche zur Maschinensteuerung genutzt wird, diverse Sensordaten erfassen und visualisieren soll und schlussendlich auf einem Raspberry Pi laufen soll. Soviel zu meinem Hintergrund.
Da ich als Maschinenbauer (noch?) kein richtiges Gespür für das Programmieren umfangreicherer Anwendungen habe, wollte ich euch fragen, ob ihr einige Richtlinien bzw. Beispiele für das Strukturieren von solchen Anwendungen kennt. Habe beispielsweise dieses Projekt hier gefunden, welches bis jetzt sehr hilfreich war:
https://gist.github.com/PhilReinhold/05 ... 4c37e2f95a
Dieses sieht dann so aus:
http://i.imgur.com/uuS3YPM.jpg
Um eine konkrete Frage zu stellen:
Insbesondere geht es mir um das TabWidget. Oft sehe ich in PyQtCode, dass von erstellten Klassen jeweils nur ein einzelnes Objekt erstellt wird. Ist das so korrekt und inwiefern bietet mir eine Klasse dann einen Vorteil?
Ist es folglich eher üblich für jeden Tab eine eigene Klasse zu erstellen (wo entsprechend nur ein Objekt von erstellt wird, nämlich der entsprechende Tab)?
Ich habe zum Beispiel versucht, eine Klasse für alle Tabs zu erstellen und entsprechend dann mehrere Objekte davon zu erstellen. Leider ist das alles sehr "hakelig", da die verschiedenen Tabs sowohl Gemeinsamkeiten (beispielsweise Layout) als auch Unterschiede haben (diverse Buttons).
Hier der Code:
In meiner MainWindow-Klasse erstelle ich das TabWidget und setze es als Zentrales Widget:
Code: Alles auswählen
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow,self).__init__()
self.setGeometry(200,200,1000,500)
self.setWindowTitle("test")
self.createComponents()
self.setupTabs()
self.createLayout()
def createMenu(self):
pass
def createComponents(self):
self.tabwidget = QtGui.QTabWidget()
def setupTabs(self):
self.tab1 = TabInhalt(self,'Seite_1')
self.tab2 = TabInhalt(self,'Seite_2')
self.tab3 = TabInhalt(self,'Seite_3')
def createLayout(self):
layoutZentral = QtGui.QVBoxLayout()
layoutZentral.addWidget(self.tabwidget)
widgetZentral = QtGui.QWidget()
widgetZentral.setLayout(layoutZentral)
self.setCentralWidget(widgetZentral)
Code: Alles auswählen
class TabInhalt(QtGui.QWidget):
def __init__(self,mainwindow,tabname):
self.tabname = tabname
super(TabInhalt,self).__init__()
self.populate_tab(self.tabname)
mainwindow.tabwidget.addTab(self, self.tabname)
def populate_tab(self, tabname):
#Tab 1
if (self.tabname=='Seite_1'):
self.labelHalloWelt = QtGui.QLabel("Hallo Welt")
self.labelHalloMom = QtGui.QLabel("Hallo Mom")
self.labelHalloDad = QtGui.QLabel("Hallo Dad")
layout = QtGui.QVBoxLayout()
layout.addWidget(self.labelHalloWelt)
layout.addWidget(self.labelHalloMom)
layout.addWidget(self.labelHalloDad)
self.setLayout(layout)
#Tab 2
elif (self.tabname =='Seite_2'):
return #(Hier habe ich mal den Code für die Leserlichkeit abgekürzt)
#Tab 3
elif (self.tabname =='Seite_3'):
return #(Hier habe ich mal den Code für die Leserlichkeit abgekürzt)
def main(argv):
app = QtGui.QApplication(argv)
mainwindow = MainWindow()
#mainwindow.showFullScreen()
mainwindow.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main(sys.argv)
Ich hoffe, dass meine Frage wenigstens etwas verständlich ist und würde mich über eine Rückmeldung freuen!
Bis jetzt macht mir die GUI-Programmierung richtig Spaß, ich habe mithilfe des pyqtgraph-Moduls schon eine zügige Darstellung der Messwerte realisieren können, auch das Arbeiten mit dem Threading-Modul klappt schon ganz gut.
PS: Warum werden die Methoden in PyQt eigentlich in "CamelCase" geschrieben...?
Gruß
Hendrik