Kapitel 29
Multimediaanwendungen mit Qt
840
Abb. 29.19: Quadratische Plattkarte der Erde. Jedes Quadrat stellt eine Zelle von
15 Längengraden und 15 Breitengraden dar.
Für die Suche nach den Geokoordinaten eines Ortes verwenden Sie das Modul geopy. Sie
installieren es in einem Shell-Fenster (Window: Eingabeaufforderung) mit dem Kommando
Das folgende Beispiel zeigt, wie man zu einer Ortsangabe die Geokoordinaten (Längengrad
und Breitengrad) findet. Sie können es im interaktiven Modus ausprobieren:
Diese Anweisung bewirkt, dass über das Internet eine Verbindung mit einem Geoserver
(OpenStreetView) hergestellt wird. Weil das manchmal ein paar Sekunden dauert, wurde
ein Timeout von zehn Sekunden eingestellt.
Hier wurden die Koordinaten von Berlin (Breitengrad, Längengrad) ausgegeben.
29.6 Lösungen
Lösung 1
Zur Vorbereitung fertigen Sie mit einem Grafik-Editor zwei kleine Bilder an. Sie stellen
Icons für die Lautstärkeeinstellung und für den Kontrast dar. Dateinamen:
volume.png und
python –m pip install geopy
>>> from geopy.geocoders import Nominatim
>>> geolocator = Nominatim()
>>> location = geolocator.geocode("Berlin", timeout=10)
>>> print(location.latitude, location.longitude)
52.5170365 13.3888599
841
29.6
Lösungen
contrast.png. Die Bilddateien werden im gleichen Ordner wie die Programmdatei gespei-
chert.
Die gegenüber dem Basisskript ergänzten und geänderten Passagen des Listings sind fett
gedruckt.
Skript:
#! /python34/pythonw.exe
# videoplayer_extended.pyw
from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import (QMediaPlayer,
QMediaContent)
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtCore import *
from PyQt5.QtGui import QPixmap
import sys
class Video(QVideoWidget): #1
def __init__(self, master):
super().__init__(master)
def keyPressEvent(self, event):
self.setFullScreen(False) #2
class Window(QWidget):
def __init__(self):
super().__init__()
self.createWidgets()
self.createLayout()
self.show()
def createWidgets(self):
self.setWindowTitle("Videoplayer")
self.videoWidget = Video(self) #3
self.videoWidget.setMinimumSize(320,180)
self.player = QMediaPlayer(self)
self.player.setVideoOutput(self.videoWidget)
self.player.setVolume(0)
self.playButton = QPushButton("Start")
self.playButton.clicked.connect(self.play)
self.playButton.setEnabled(False)
self.selectButton = QPushButton("Wähle Video")
Kapitel 29
Multimediaanwendungen mit Qt
842
self.selectButton.clicked.connect(self.selectFile)
self.fullButton = QPushButton("Vollbild") #4
self.fullButton.clicked.connect(self.fullScreen)
self.volumeSlider = QSlider(Qt.Horizontal)
self.volumeSlider.sliderMoved.connect(
self.player.setVolume)
self.volumeSlider.setRange(0, 100)
self.contrastSlider = QSlider(Qt.Horizontal) #5
self.contrastSlider.sliderMoved.connect(
self.videoWidget.setContrast) #6
self.contrastSlider.setRange(-100, 100)
self.volumeLabel = QLabel() #7
self.volumeLabel.setPixmap(QPixmap("volume.png"))
self.contrastLabel = QLabel() #8
self.contrastLabel.setPixmap(QPixmap("contrast.png"))
self.messageLabel = QLabel(self) #9
self.messageLabel.move(30, 30)
self.messageLabel.hide()
def createLayout(self):
vBox = QVBoxLayout()
vBox.addWidget(self.videoWidget)
hBox1 = QHBoxLayout() #10
hBox1.addWidget(self.playButton)
hBox1.addWidget(self.selectButton)
hBox1.addWidget(self.fullButton)
hBox2 = QHBoxLayout()
hBox2.addWidget(self.volumeLabel)
hBox2.addWidget(self.volumeSlider)
hBox2.addWidget(self.contrastLabel)
hBox2.addWidget(self.contrastSlider)
vBox.addLayout(hBox1) #11
vBox.addLayout(hBox2)
self.setLayout(vBox)
def play (self):
if self.playButton.text() == "Start":
self.playButton.setText("Pause")
self.messageLabel.hide() #12
self.player.play()
else:
843
29.6
Lösungen
Erläuterung:
#1: Eine neue Klasse zur Darstellung von Filmen wird definiert. Sie wird von QVideoWidget
abgeleitet.
#2: Der Vollbildmodus wird ausgeschaltet.
#3: An Stelle eines QVideoWidget-Objektes wird nun ein Objekt der neuen Klasse Video
instanziiert.
#4: Eine neue Schaltfläche wird erzeugt und ihr clicked-Signal mit der Methode
self.fullScreen() verbunden.
#5: Ein waagrechter Schieberegler wird definiert.
#6: Das sliderMoved-Signal – es wird gesendet, wenn der Schieber bewegt wird – wird mit
der (bereits definierten) Methode
setContrast() des QVideoWidgets-Objektes verbunden.
So wird dafür gesorgt, dass mit dem Schieberegler der Kontrast eingestellt werden kann.
#7: Ein neues Label für den Lautstärkeregler wird erzeugt. Auf dieses Label wird in der
nächsten Zeile ein Icon (Lautsprecher) gesetzt.
#8: Ein neues Label für den Kontrastregler wird erzeugt. Auf dieses Label wird in der nächs-
ten Zeile ein Icon (schwarzes und weißes Rechteck) gesetzt.
#9: Für die Anzeige der aktuellen Position des Videos wird ein neues Label erzeugt. Es wird
im Applikationsfenster an die Position
(30, 30) gesetzt und dann ausgeblendet. Denn die-
ses Label soll nur zu sehen sein, wenn der Film mit P
AUSE angehalten worden ist.
self.playButton.setText("Start") #13
self.messageLabel.setText(
"Position: %i Sekunden" \
% round(self.player.position()/1000))
self.messageLabel.adjustSize()
self.messageLabel.show()
self.player.pause()
def selectFile(self):
fileName, _ = QFileDialog.getOpenFileName(self,
"Video öffnen")
self.media = QMediaContent(QUrl(fileName))
self.player.setMedia(self.media)
self.playButton.setEnabled(True)
def fullScreen(self):
self.videoWidget.setFullScreen(True) #14
app = QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())
Kapitel 29
Multimediaanwendungen mit Qt
844
#10: Es gibt im Layout zwei horizontale Boxen. In die obere horizontale Box kommen die
drei Schaltflächen. In die untere horizontale Box kommen die Schieberegler mit ihren
Labels.
#11: Die beiden horizontalen Boxen werden der vertikalen Box zugefügt, so dass sie unter-
einander erscheinen.
#12: Wenn das Video (wieder) gestartet worden ist, wird das Label mit der aktuellen Position
(wieder) ausgeblendet.
#13: Wenn der Film durch Anklicken von PAUSE angehalten worden ist, passiert Folgendes:
Der Text auf dem Button wird wieder auf
Start gesetzt. Dann wird auf das Label für die
Positionsangabe ein neuer Text gesetzt. Für diesen Text gibt es ein Muster
"Position: %i
Sekunden"
. Der Platzhalter %i wird durch eine ganze Zahl ersetzt. Diese Zahl ist die (gerun-
dete) Anzahl von Sekunden, die das Video gelaufen ist. Beachten Sie, dass der Aufruf
self.player.position() die Anzahl der Millisekunden seit Beginn des Videos liefert. Das
Label wird an die Größe des neuen Textes angepasst und dann eingeblendet.
#14: Hier wird der Vollbildmodus eingestellt. Man sieht auf dem Bildschirm nur noch den
Film.
Lösung 2
Das Skript aus Abschnitt 29.3.1 wird erweitert. Die zusätzlichen Programmzeilen sind im
folgenden Skript fett gedruckt.
#! /python34/pythonw.exe
# ansichtskarte_aufgabe.pyw#
...
class Window(QWidget):
def __init__(self):
super().__init__()
...
def createWidgets(self):
self.setWindowTitle("Ansichtskarte")
self.label = QLabel()
...
self.saveButton = QPushButton("Bild Speichern")
self.saveButton.clicked.connect(self.save) #1
self.colorButton = QPushButton("Farbe")
self.colorButton.clicked.connect(self.selectColor)
self.fontButton = QPushButton("Schriftart")
self.fontButton.clicked.connect(self.selectFont)
def createLayout(self):
vBox = QVBoxLayout()

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.