Grafische Oberflächen mit Qt
Installation
sudo apt install python3-pyqt5* pyqt5-dev-tools
Programm "Hello"
#!/usr/bin/env python3
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QLabel, QWidget, QApplication, QLineEdit, \
QPushButton
from PyQt5.QtCore import QSize
class MyWindow(QWidget):
def __init__(self):
# Konstruktor von QWidget aufrufen
super().__init__()
# Fenstergröße und Titel einstellen
self.setMinimumSize(QSize(300, 100))
self.setWindowTitle('Greeting')
# Beschriftung
nameLabel = QLabel("Name:", self)
nameLabel.move(20, 20)
# Eingabefeld
self.nameEntry = QLineEdit(self)
self.nameEntry.move(80, 20)
self.nameEntry.resize(200, 20)
# Send Button
sendbutton = QPushButton("Send", self)
sendbutton.clicked.connect(self.greetMe)
sendbutton.move(80, 60)
sendbutton.resize(200, 20)
# Ausgabe
self.greetingLabel = QLabel(self)
self.greetingLabel.move(80, 100)
self.greetingLabel.resize(200, 20)
# Widget anzeigen
self.show()
def greetMe(self):
print(self.nameEntry.text())
self.greetingLabel.setText("Hallo " + self.nameEntry.text() + "!")
# Game loop
app = QApplication(sys.argv)
win = MyWindow()
app.exec_()
Übungsaufgabe Bit-Repräsentation mit Qt
Grundgerüst
#!/usr/bin/env python3
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLCDNumber, QCheckBox
from PyQt5.QtCore import Qt, QSize, QTimer
# Klasse für das Hauptfenster
class MyWindow(QMainWindow):
def __init__(self):
# Konstruktor von QMainWindow aufrufen
super().__init__()
self.setMinimumSize(QSize(250, 120))
self.setWindowTitle('Bit Representation')
wid = QWidget(self)
self.setCentralWidget(wid)
vlayout = QVBoxLayout()
wid.setLayout(vlayout)
self.lcd_number = QLCDNumber(2, wid)
vlayout.addWidget(self.lcd_number)
hlayout = QHBoxLayout()
vlayout.addLayout(hlayout)
self.checkboxes = [QCheckBox(wid), QCheckBox(wid), QCheckBox(wid), QCheckBox(wid)]
for index, cb in enumerate(self.checkboxes):
hlayout.addWidget(cb)
cb.clicked.connect(self.bin2dec)
def bin2dec(self):
value = 0
for index, cb in enumerate(self.checkboxes):
if cb.isChecked():
value+=1
self.lcd_number.display(value)
app = QtWidgets.QApplication([])
win = MyWindow()
win.show()
app.exec_()
Aufgabe Teil 1
Vervollständige bitte das Grundgerüst, sodass die Binärzahl - repräsentiert durch die angehakten Checkboxen - in eine Dezimalzahl umgerechnet und im LCD angezeigt wird.
Aufgabe Teil 2
Zeige die Binärzahl zusätzlich über die LEDs am Raspberry-Zusatzboard an. Verwende dazu die Library gpiozero.
Übungsaufgabe Dezimal-Binär-Konverter
Mit einem QSlider wird eine Dezimalzahl von 0…15 eingestellt. Der aktuelle dezimale Wert wird neben dem Slider angezeigt. Die Visualisierung der zugehörigen Dualzahl erfolgt mittels QLabel (GUI) und LEDs (Zusatzboard).
Tipp: Zur Farbänderung des Hintergrundes eines QLabel kann die Funktion setStyleSheet("background-color: rgb(x, y, z)") mit x, y, z im Bereich 0…255 für die jeweilige Farbe verwendet werden.

Empfohlener Lösungsansatz:

Code zur Erstellung des Layouts:
# Slider + Label Anzeige Dezimalwert
self.slider = QSlider(Qt.Horizontal)
self.label = QLabel('0')
sliderbox = QHBoxLayout()
sliderbox.addWidget(self.slider)
sliderbox.addWidget(self.label)
# Labels fuer 4 Bits
self.bitlabels = [] # Liste
# hier bitlabels erstellen
bitbox = QHBoxLayout()
for bitlabel in self.bitlabels:
bitbox.addWidget(bitlabel)
# Layout zusammenbauen
vbox = QVBoxLayout()
vbox.addLayout(sliderbox)
vbox.addLayout(bitbox)
# vbox anzeigen in QWidget
self.setLayout(vbox)
Variablen müssen nur dann als Membervariablen (self) bezeichnet werden, wenn sie in Funktionen außerhalb des Konstruktors ausgelesen oder verändert werden!
Bei Verwendung der Bibliothek gpiozero lässt sich eine Gruppe von LEDs sehr elegant als Liste ansteuern:
self.leds = LEDBoard(18, 23, 24, 25)