Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einleitung
2 Überblick über Python
3 Die Arbeit mit Python
4 Der interaktive Modus
5 Grundlegendes zu Python-Programmen
6 Kontrollstrukturen
7 Das Laufzeitmodell
8 Basisdatentypen
9 Benutzerinteraktion und Dateizugriff
10 Funktionen
11 Modularisierung
12 Objektorientierung
13 Weitere Spracheigenschaften
14 Mathematik
15 Strings
16 Datum und Zeit
17 Schnittstelle zum Betriebssystem
18 Parallele Programmierung
19 Datenspeicherung
20 Netzwerkkommunikation
21 Debugging
22 Distribution von Python-Projekten
23 Optimierung
24 Grafische Benutzeroberflächen
25 Python als serverseitige Programmiersprache im WWW mit Django
26 Anbindung an andere Programmiersprachen
27 Insiderwissen
28 Zukunft von Python
A Anhang
Stichwort

Download:
- ZIP, ca. 4,8 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Python von Peter Kaiser, Johannes Ernesti
Das umfassende Handbuch - Aktuell zu Python 2.5
Buch: Python

Python
gebunden, mit CD
819 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1110-9
Pfeil 24 Grafische Benutzeroberflächen
  Pfeil 24.1 Toolkits
  Pfeil 24.2 Einführung in PyQt
    Pfeil 24.2.1 Installation
    Pfeil 24.2.2 Grundlegende Konzepte von Qt
  Pfeil 24.3 Entwicklungsprozess
    Pfeil 24.3.1 Erstellen des Dialogs
    Pfeil 24.3.2 Schreiben des Programms
  Pfeil 24.4 Signale und Slots
  Pfeil 24.5 Überblick über das Qt-Framework
  Pfeil 24.6 Zeichenfunktionalität
    Pfeil 24.6.1 Werkzeuge
    Pfeil 24.6.2 Koordinatensystem
    Pfeil 24.6.3 Einfache Formen
    Pfeil 24.6.4 Grafiken
    Pfeil 24.6.5 Text
    Pfeil 24.6.6 Eye-Candy
  Pfeil 24.7 Model-View-Architektur
    Pfeil 24.7.1 Beispielprojekt: Ein Adressbuch
    Pfeil 24.7.2 Auswählen von Einträgen
    Pfeil 24.7.3 Editieren von Einträgen
  Pfeil 24.8 Wichtige Widgets
    Pfeil 24.8.1 QCheckBox
    Pfeil 24.8.2 QComboBox
    Pfeil 24.8.3 QDateEdit
    Pfeil 24.8.4 QDateTimeEdit
    Pfeil 24.8.5 QDial
    Pfeil 24.8.6 QDialog
    Pfeil 24.8.7 QGLWidget
    Pfeil 24.8.8 QLineEdit
    Pfeil 24.8.9 QListView
    Pfeil 24.8.10 QListWidget
    Pfeil 24.8.11 QProgressBar
    Pfeil 24.8.12 QPushButton
    Pfeil 24.8.13 QRadioButton
    Pfeil 24.8.14 QScrollArea
    Pfeil 24.8.15 QSlider
    Pfeil 24.8.16 QTableView
    Pfeil 24.8.17 QTableWidget
    Pfeil 24.8.18 QTabWidget
    Pfeil 24.8.19 QTextEdit
    Pfeil 24.8.20 QTimeEdit
    Pfeil 24.8.21 QTreeView
    Pfeil 24.8.22 QTreeWidget
    Pfeil 24.8.23 QWidget


Galileo Computing - Zum Seitenanfang

24.4 Signale und Slots  topZur vorigen Überschrift

Beim Schreiben eines Programms mit grafischer Benutzeroberfläche wird das Prinzip der ereignisgesteuerten Programmierung angewandt. Dieses Prinzip sieht nicht vor, dass ein Programm sequenziell von oben nach unten abgearbeitet wird, sondern führt beim Auftreten bestimmter Ereignisse einen Codeabschnitt aus, der vom Programmierer für dieses Ereignis vorgesehen wurde. Die Anwendung der ereignisgesteuerten Programmierung ist in diesem Fall notwendig, da im Falle einer grafischen Benutzeroberfläche der Benutzer das Programm steuert und nicht das Programm den Benutzer, wie es bei einer Konsolenanwendung der Fall war. Der Benutzer steuert das Programm durch seine Eingaben, die im Programm in Form von Ereignissen ankommen. Wann und in welcher Reihenfolge der Benutzer seine Eingaben macht, ist durch das Programm nicht vorgegeben.

In Qt finden sich zwei Techniken der ereignisgesteuerten Programmierung: zum einen sogenannte Events und zum anderen Signale und Slots. Beide Techniken sollen im Folgenden besprochen werden.

Jedes Widget in der grafischen Benutzeroberfläche wird programmintern durch eine Instanz einer entsprechenden Qt-Klasse repräsentiert. Jede dieser Klassen bietet sogenannte Eventhandler an. Das sind Methoden, die der Programmierer in einer abgeleiteten Klasse überschreiben kann, um beim Eintreten eines speziellen Ereignisses (Event) eigenen Code ausführen zu können. Events werden nur für wenige Ereignisse verwendet, die aber häufig eintreten. Ein Beispiel für ein solches Ereignis ist das paintEvent, das immer dann eintritt, wenn der Inhalt eines Widgets neu gezeichnet werden muss. Das Widget reagiert auf das Event durch Ausführung seines Eventhandlers. Dies kann unter Umständen sehr häufig passieren. Ein Beispiel für die Implementation eines Eventhandlers finden Sie in Abschnitt 24.6 im Zusammenhang mit der Zeichenfunktionalität von Qt.

Neben den Events bietet das Qt-Framework das Konzept von Signalen und Slots für die Behandlung von Ereignissen an. Dieses zentrale Konzept, dessen Ziel es ganz allgemein ist, die Kommunikation von Qt-Objekten, beispielsweise Widgets, untereinander zu gewährleisten, ist womöglich das größte Unterscheidungsmerkmal zwischen Qt und anderen GUI-Toolkits.

Ein Signal wird von einem Widget gesendet, wenn bestimmte Ereignisse, beispielsweise eine Benutzereingabe, eingetreten sind. Es gibt für jedes Widget in Qt vordefinierte Signale für die meisten Anwendungsfälle. Es ist jedoch auch möglich, eigene Signale zu selbst bestimmten Ereignissen zu senden. Dazu wird die emit-Methode eines Qt-Objekts, beispielsweise also eines Widgets, verwendet.

Um ein Signal zu erhalten, muss ein sogenannter Slot (dt. Steckplatz) eingerichtet werden. Ein Slot ist eine Funktion oder Methode, die immer dann aufgerufen wird, wenn ein bestimmtes Signal gesendet wird. Dazu muss ein Slot mit einem Signal verbunden werden. Es ist durchaus möglich, einen Slot mit mehreren Signalen zu verbinden.

Im Folgenden wird das Beispiel des letzten Kapitels zu einer sinnvollen Anwendung erweitert. Diese Anwendung soll die Daten, die der Benutzer in den Dialog eingibt, in das parallel geöffnete Konsolenfenster ausgeben, sofern der Benutzer die Eingaben durch Klicken des OK-Buttons bestätigt. Beim Drücken des Abbrechen-Buttons sollen keine Daten ausgegeben werden.

import sys 
from PyQt4 import QtGui, QtCore 
from hauptdialog import Ui_Hauptdialog as Dlg
class MeinDialog(QtGui.QDialog, Dlg): def __init__(self): QtGui.QDialog.__init__(self) self.setupUi(self)
# Slots einrichten self.connect(self.buttonOK, QtCore.SIGNAL("clicked()"), self.onOK) self.connect(self.buttonAbbrechen, QtCore.SIGNAL("clicked()"), self.onAbbrechen)
def onOK(self): # Daten auslesen d = {} print "Vorname: %s" % self.vorname.text() print "Nachname: %s" % self.nachname.text() print "Adresse: %s" % self.adresse.toPlainText() datum = self.geburtsdatum.date().toString("dd.MM.yyyy") print "Geburtsdatum: %s" % datum
if self.agb.checkState(): print "AGBs akzeptiert" if self.newsletter.checkState(): print "Katalog bestellt" self.close()
def onAbbrechen(self): print "Schade" self.close()

Im Konstruktor der Dialogklasse MeinDialog werden mithilfe der von QDialog vererbten Methode connect zwei Slots angelegt und mit jeweils einem Signal verbunden. Die Methode connect bekommt zunächst die Instanz übergeben, von der ein Signal empfangen werden soll. In diesem Fall sind das die Button Widgets self.buttonOK und self.buttonAbbrechen. Der zweite Parameter spezifiziert, welches Signal empfangen werden soll. Dazu wird die Funktion QtCore.SIGNAL mit einer Beschreibung des Signals in Textform aufgerufen. Diese Signalbeschreibung besteht zum einen aus dem Namen des Signals, in diesem Fall clicked und zum anderen aus der Parametersignatur des Signals, die in Klammern hinter den Signalnamen geschrieben wird. Da es sich bei Qt eigentlich um eine C++-Bibliothek handelt, müssen die Parametersignaturen in C++-Syntax angegeben werden. Das soll uns aber im Moment noch nicht stören, da die meisten grundlegenden Qt-Signale parameterlos sind. Der dritte und letzte Parameter der Methode connect ist das Funktionsobjekt der Methode, die bei Empfangen des entsprechenden Signals aufgerufen werden soll. Die Parametersignatur der Methode muss mit der des Signals übereinstimmen.

Die Methode onOK ist ein Slot für das Signal clicked des OK-Button-Widgets. Das bedeutet, dass die Methode immer dann aufgerufen wird, wenn der Benutzer auf den OK-Button klickt. Analog dazu wird die Methode onAbbrechen aufgerufen, wenn der Benutzer auf den Abbrechen-Button klickt.

In der Methode onOK sollen die Eingaben des Benutzers aus den verschiedenen Widgets des Hauptdialogs ausgelesen werden. Jedes dieser Widgets wird durch eine Instanz einer entsprechenden Qt-Klasse repräsentiert. Diese Instanzen werden durch Attribute der automatisch generierten Basisklasse Dlg referenziert, deren Namen wir im Qt Designer festgelegt haben. Welches Widget dabei welchen Namen bekam, können Sie in der Tabelle am Ende von Abschnitt 24.3.1 nachlesen. Die Attributnamen sollten allerdings selbsterklärend sein.

Über die angesprochenen Attribute können wir den Inhalt der Steuerelemente auslesen. Wie dies geschieht, ist jedoch von Widget zu Widget verschieden, da sich ja auch die enthaltenen Daten stark unterscheiden. So kann beispielsweise auf den Inhalt eines Line Edit Widgets über die Methode text zugegriffen werden. Näheres zu den wichtigsten Widget-Klassen des Qt-Frameworks finden Sie in Abschnitt 24.8. Erwähnenswert ist noch, dass die Methode date der Date-Edit-Instanz geburtsdatum das gespeicherte Datum nicht direkt in Form eines Strings, sondern in Form einer QDate-Instanz zurückgibt. Diese muss erst durch Aufruf der Methode toString in einen String konvertiert werden. Die ausgelesenen Daten werden mithilfe des Schlüsselworts print in die Konsole ausgegeben. Zum Schluss, nachdem alle Daten ausgelesen wurden, wird der Dialog durch Aufruf der Methode close geschlossen.

Im zweiten Slot, onAbbrechen, sind abgesehen vom Schließen des Dialogs keine weiteren Operationen vonnöten.

app = QtGui.QApplication(sys.argv) 
dialog = MeinDialog() 
dialog.show() 
sys.exit(app.exec_())

Bei dem Code, der die Applikations- und Dialogklasse instanziiert und die Main Event Loop, startet handelt es sich um denselben, der schon im letzten Beispielprogramm seinen Dienst getan hat.


Hinweis
Wie das Beispiel demonstriert, öffnet auch ein Python-Programm mit grafischer Benutzeroberfläche unter Windows immer noch ein Konsolenfenster, in das mittels print geschrieben werden kann.

Das mag in einigen Fällen zwar wünschenswert sein, ist jedoch häufig störend, wenn die Kommunikation mit dem Benutzer vollständig über die grafische Oberfläche ablaufen soll. Wenn Sie nicht wünschen, dass ein Konsolenfenster geöffnet wird, können Sie die Dateiendung der Python-Programmdatei von .py nach .pyw ändern. Dann werden alle Ausgaben in die Konsole unterdrückt und wird kein Konsolenfenster geöffnet.




Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Python
Python
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Einstieg in Python






 Einstieg in Python


Zum Katalog: Silverlight 4






 Silverlight 4


Zum Katalog: Python 3






 Python 3


Zum Katalog: JavaScript






 JavaScript


Zum Katalog: jQuery






 jQuery


Zum Katalog: CSS






 CSS


Zum Katalog: Einstieg in XML






 Einstieg in XML


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de