Barrierefreie Softwareentwicklung mit Python

Die Programmiersprache Python ist in der Rangliste der Programmiersprachen auf Platz 3. In diesem Artikel wird erklärt wie mit Python barrierefreie Softwareentwicklung umgesetzt werden kann.

Warum ist die Programmiersprache Python cool?

Das, was mich an Python am meisten fasziniert ist, die Plattformunabhängigkeit. Egal ob ich ein Python Programm mit Qt oder eine Konsolenanwendung unter Windows 10 entwickle, beide Programme laufen auch im Betriebssystem Ubuntu 20.04 und in MacOS 10.15. Ein Python-Programm unter Ubuntu oder MacOS zum Laufen zu bringen ist sehr einfach. Die Programmiersprache Python ist cool, weil ich barrierefreie Programme entwickeln kann, die auf allen Betriebssystemen funktionieren.

Marlems barrierefreier PQT-Texteditor im Betriebssystem Windows
So sieht Marlems barrierefreier PQT-Texteditor im Betriebssystem Windows aus

Die Situation von blinden Menschen bei der Bedienung von Software

Blinde Menschen können nur Programme bzw. Software bedienen die screenreadertauglich ist. Das bedeutet, alle Bedienelemente, Bilder oder Grafiken einer Programmoberfläche benötigen eine Beschreibung in Form eines Textes. Bei Bedienelementen muss der Text die Funktion bzw. den Sinn des Bedienelementes erklären. Bei Bilder oder Grafiken muss der Text den Inhalt des Bildes bzw. der Grafik beschreiben. Aber nun ein konkretes Beispiel: Menschen die sehen können und ein E-Mailprogramm suchen, welches für sie gut zu bedienen ist, können 10 verschiedene E-Mailprogramme testen. Blinde Menschen müssen erst herausfinden, ob das E-Mailprogramm, dass sie testen möchten so programmiert wurde, dass der Screenreader den sie nutzen, die Programmoberfläche lesen kann. Programme die für Screenreader keine Textinformation bereitstellen, können blinde Menschen nicht bedienen. Das ist eine erhebliche Einschränkung. Diese Einschränkung möchte ich beseitigen. Deswegen erkläre ich in diesem Blogartikel wie Python-Programme barrierefrei entwickelt werden können.

Barrierefreie Softwareentwicklung mit Python und Qt

Qt ist ein Anwendungsframework und GUI-Toolkit zur plattformübergreifenden
Entwicklung von Programmen und grafischen Benutzeroberflächen.
Ich habe mit der Programmiersprache Python und Qt einen Texteditor entwickelt der für blinde und sehbehinderte Menschen bedienbar ist. Der Texteditor hat den gleichen Funktionsumgang wie der Windows-Texteditor. Die Programmoberfläche sieht genauso aus, wie die Programmieroberflächen des JFX-Texteditors und WPF-Texteditors. Er wird in den nächsten 2 Monaten auch auf meine Downloadseite kommen.

Damit die Screenreader-Software dem blinden oder sehbehinderten Anwendungsnutzer die Programmoberfläche vorlesen kann, müssen den Qt-Komponenten Texte hinterlegt werden, welche die Bedienelemente beschreiben. Folgende Eigenschaften müssen Texte hinterlegt werden, damit der Screenreader dem Anwender die Programmoberfläche vorlesen kann.

AccessibleName:
Gibt der Komponente einen Namen der von der Screenreader-Software vorgelesen wird.

AccessibleDescription:
Die zugängliche Beschreibung eines Widgets sollte vermitteln, was ein Widget macht. Während der AccessibleName eine kurze und konsistente Zeichenfolge sein sollte (z. B. Speichern ), sollte die Beschreibung mehr Kontext enthalten.

Marlems barrierefreier PQT-Texteditor im Betriebssystem Ubuntu mit großer Schrift und angepaßter Schriftfarbe
Marlems barrierefreier PQT-Texteditor im Betriebssystem Ubuntu mit angepaßter Schriftfarbe und großer Schrift

Codebeispiel:
self.editsuchen.setAccessibleName("Bitte Suchbegriff eingeben. Suche Starten mit der Enter-Taste")
self.editsuchen.setAccessibleDescription("Bitte einen Suchbegriff eingeben. Suche Starten mit der Enter-Taste")

In meinem Codebeispiel haben beide Eigenschaften denselben Text. Das ist eigentlich falsch, hat aber einen Grund. Die Windows-Screenreader NVDA und Jaws, lesen die Eigenschaft „AccessibleName“ und den Inhalt von AccessibleDescription lesen beide Screenreader nicht.

Laut Spezifikation ist das falsch. Damit Python-Programme von blinden Windows-Nutzern bedient werden können, muss dieser Weg gegangen werden. Der Screenreader Orca des Betriebssystems Ubuntu, macht es richtig. Er liest den Text der Eigenschaft „ AccessibleDescription“, aber nicht den Text der Eigenschaft „AccessibleName“.

Wenn Sie barrierefreie Python-Anwendungen entwickeln möchten, die auf allen Betriebssystemen laufen, müssen Sie den Eigenschaften AccessibleName und AccessibleDescription den gleichen Text zuweisen.

Tasturbedienbarkeit

Damit eine Python/Qt-Anwendung komplett per Tastatur bedienbar ist, müssen Beschriftungen (=Labels) mit Eingabefeldern verknüpft werden. Dies kann mit setBuddy realisiert werden.

Codebeispiel:
self.labelsuchen = QLabel('&Suchen',self)
self.editsuchen = QAcccessibilityEdit(self)
self.labelsuchen.setBuddy(self.editsuchen)

Das &-Zeichen bei Qlabel sorgt dafür das der Label mit der Tastenkombination Alt+s ansteuerbar ist. Dadurch, dass „labelsuchen“ über setBuddy mit dem Eingabefeld editsuchen verbunden ist, wird beim Drücken der Tastenkombination Alt+s das Eingabefeld „editsuchen“ aktiviert.

Visuelle und programmgesteuerte Anzeige der Position des Tastaturfokus

Damit Menschen mit einer Sehbehinderung erkennen welches Bedienelement aktiv ist, muss eine Software dies deutlich sichtbar machen. Meine Lieblingsmethode ist, dass aktive Bedienelement bekommt die Hintergrundfarbe Gelb.

Im Python gibt es ein focusInEvent und ein focusOutEvent für Bedienelement aktiv und Bedienelement ist nicht mehr aktiv. Um diese Ereignisse (engl. Event) definieren zu können, muss eine Klasse abgeleitet werden.  Ich leite von der Python-Klasse QLineEdit meine Klasse QAccessibilityEdit ab.

Hier der Code:

class QAcccessibilityEdit(QLineEdit):
def focusInEvent(self, QFocusEvent):
    self.setStyleSheet("background-color: yellow;"
                       "color: black;") def focusOutEvent(self, QFocusEvent):
          self.setStyleSheet("background-color: white" + ";"
                             "color: black;")
Marlems barrierefreier PQT-Texteditor im Betriebssystem MacOS
So sieht Marlems barrierefreier PQT-Texteditor im Betriebssystem MacOS aus

Barrierefreie Softwareentwicklung mit Python: Konsolenanwendungen

Es gibt Programme die benötigen nicht zwingend ein Grafische Benutzeroberfläche. Diese Programme laufen im Betriebssystem Windows im Dosfenster und in den Betriebssystemen Ubuntu und MacOS in der Konsole. Deswegen nennen sie sich Konsolenanwendungen. Konsolenanwendungen können nicht per Computermaus bedient werden, sondern müssen per Tastatur bedient werden. Das kommt blinden und sehbehinderten Menschen sehr entgegen.

Wenn im Linux-Betriebssystem Ubuntu der Screenreader Orca nicht den Inhalt des Konsolen-Fensters vorliest, kann dieser mit folgendem Konsolen-Kommando nachinstalliert werden:
sudo apt install orca

Zum Thema Farbgestaltung kann bei einer Konsolen-Anwendung wenig falsch gemacht werden. Im Betriebssystem Windows und Ubuntu hat das Konsolenfenster einen schwarzen Hintergrund und die Schriftfarbe ist, weis.
Im Betriebssystem MacOS hat das Konsolen-Fenster einen weisen Hintergrund und die Schriftfarbe ist schwarz. Beide Farbkombinationen sind für Menschen mit einer Farbfehlsichtigkeit barrierefrei.

Marlems PyAssitent zeigt die Route von Dußlingen nach Berlin in Google Maps
Das barrierefreie Python-Programm Marlems PyAssitent zeigt die Route von Dußlingen nach Berlin in Google Maps

Einstellungen des Betriebssystems in das Konsolen-Fenster übernehmen

Wenn in Betriebssystemen eine große Systemschrift eingestellt wird, wird diese in den Konsolenfenstern nicht übernommen. Deswegen erkläre ich wie Menschen mit einer Sehbehinderung in Konsolen-Fenstern eine große Schrift einstellen können.

Windows-Dosfenster Ubuntu Konsolenfenster MacOS Konsolenfenster
Taste Alt + Space danach Taste E für Eigenschaften Taste Umschalt + F10 und dann Taste E für Einstellungen Taste cmd + oder cmd – kann die Schrift des Konsolenfensters vergrößert und verkleinert werden.

Natürlich können die Einstellungen im Betriebssystem Windows und Ubuntu auch mit der Computermaus erreicht werden, da aber Menschen mit einer Sehbehinderung oft die Tastatur nutzen, um den Computer zu bedienen, habe ich die Tastenkombinationen aufgeführt.

Übernahme von Betriebssystem-Einstellungen bei Qt-Anwendungen

Menschen mit einer Sehbehinderung können in den gängigen Betriebssystemen eine große Systemschrift einstellen. Menschen mit einer sehr starken Seheinschränkung oder mit einer Farbfehlsichtigkeit können in Betriebssystemen einen hohen Farbkontrast einstellen. Eine barrierefreie Software sollte diese Einstellungen übernehmen.

Die Programmiersprache Java und die Programmiersprache Python haben eine Gemeinsamkeit. Die Programme welche mit diesen Programmiersprachen entwickelt werden, werden bei der Ausführung interpretiert. Damit ein Java-Programm ausgeführt werden kann, muss die Java Runtime Environment installiert sein. Damit ein Python-Programm ausgeführt werden kann, muss Python installiert sein.

Die Programmiersprache Python hat hier im Vergleich mit der Programmiersprache Java einen großen Nachteil. Betriebssystem-Einstellungen können nicht übernommen werden.

Bei Java Swing muss ein bestimmter Java-Code eingebaut werden, damit eine große Systemschrift und der hohe Farbkontrast des Betriebssystems übernommen werden kann.

Bei JavaFX wird die große Systemschrift automatisch übernommen. Damit der hohe Farbkontrast des Betriebssystems übernommen wird, muss bei JavaFX Code ins Programm eingebaut werden, damit der hohe Farbkontrast des Betriebssystems übernommen wird.

Da mit Python nicht auf das Betriebssystem zugegriffen werden kann, hatte ich ein Problem. Damit Python-Anwendungen von Menschen mit Sehbehinderung und Menschen mit Farbfehlsichtigkeit bedient werden können, habe ich mir folgende Lösungen ausgedacht, die im Praxistest im Betriebssystem Windows, Ubuntu und MacOS funktioniert haben.

class GlobaleEinstellungen:
def __init__(self):
    self.pfadgeoeffnetedatei = ''
    self.isfirsttime = False
    self.editorbarrierefrei = False
    GlobaleEinstellungen.aktbedienelementhintergrundfarbe = "white"
    GlobaleEinstellungen.bedienelementeschriftfarbe = "black"
# Visuelle und programmgesteuerte Anzeige der Position des Tastaturfokus
class QAcccessibilityEdit(QLineEdit):
def focusInEvent(self, QFocusEvent):
    self.setStyleSheet("background-color: " + GlobaleEinstellungen.aktbedienelementhintergrundfarbe + ";"
                       "color: " + GlobaleEinstellungen.bedienelementeschriftfarbe + ";")
def focusOutEvent(self, QFocusEvent):
          self.setStyleSheet("background-color: white" + ";"
                             "color: " + GlobaleEinstellungen.bedienelementeschriftfarbe + ";")
class QAcccessibilityPlainTextEdit(QPlainTextEdit):
def focusInEvent(self, QFocusEvent):
    self.setStyleSheet("background-color: " + GlobaleEinstellungen.aktbedienelementhintergrundfarbe + ";"
                       "color: " + GlobaleEinstellungen.bedienelementeschriftfarbe + ";")
def focusOutEvent(self, QFocusEvent):
          self.setStyleSheet("background-color: white" + ";"
                             "color: " + GlobaleEinstellungen.bedienelementeschriftfarbe + ";")
class QAcccessibilityComboBox(QComboBox):
def focusInEvent(self, QFocusEvent):
    self.setStyleSheet("background-color: " + GlobaleEinstellungen.aktbedienelementhintergrundfarbe + ";"
                       "color: " + GlobaleEinstellungen.bedienelementeschriftfarbe + ";")
def focusOutEvent(self, QFocusEvent):
          self.setStyleSheet("background-color: white" + ";"
          "color: " + GlobaleEinstellungen.bedienelementeschriftfarbe + ";")

Folgende Programmaufrufe funktionieren.
Betriebssystem Windows 10: python PQTTexteditor.py 2 blue
Betriebssystem Ubuntu 20.04: python3 PQTTexteditor.py 2 blue
Betriebssystem MacOS 10.15: python3 PQTTexteditor.py 2 blue

Erklärung:
2 ist die Schriftgröße und blue ist die Schriftfarbe.

Barrierefreie Softwareentwicklung mit Python – Deployment

Deployment, zu Deutsch Softwareverteilung, nennt man Prozesse zur Installation von Software auf Computern. Das Deployment von Python-Anwendungen die mit Qt entwickelt sind, ist aus der Sicht der Usability, Benutzerfreundlichkeit, unerfreulich.
Die Programmiersprache Python ist, genau wie die Programmiersprache Java eine interpretierte, höhere Programmiersprache. Das bedeutet, damit ein Python-Programm auf einem Betriebssystem ausgeführt werden kann, muss die Programmiersprache Python installiert sein. In den Betriebssystemen Windows und MacOS muss Python installiert werden. Im Linux-Betriebssystem Ubuntu ist die Programmiersprache Python vorinstalliert.

Qt installieren auf unterschiedliche Betriebssysteme

Wenn Sie eine Python-Anwendung entwickelt haben mit einer Grafischen Qt-Oberfläche, dann muss auf dem Zielcomputer Qt installiert werden. Hier zeige ich wie Qt in Windows, Ubuntu und MacOS installiert werden kann.

Qt im Betriebssystem Windows im Dosfenster installieren geht mit diesem Befehl:
pip install pyqt5
Qt im Linux-Betriebssystem Ubuntu installieren geht mit diesem Befehl:
sudo apt-get install python3-pyqt5
Qt im Apple-Betriebssystem MacOS installieren geht mit diesem Befehl:
sudo python3 -m pip install PyQt5
Diese Kommandos sind für Informatiker nichts Spannendes, jedoch für Nicht-Informatiker Chinesisch rückwärts. Ich habe bis zum heutigen Tag noch keine Methode gefunden wie PyQt im Rahmen einer Installationsroutine automatisiert installiert werden kann.

Deployment für barrierefreie Konsolenanwendungen

Wenn Sie mit Python barrierefreie Software entwickeln die keine grafische Oberfläche hat, dann ist das eine barrierefreie Konsolenanwendung.

In der Regel muss bei der Weitergabe von Konsolen-Anwendungen nichts zusätzlich installiert werden. Das bedeutet, dass Sie nur die Python-Datei weitergeben müssen. Diese muss auf den Zielcomputer kopiert werden und zusammen mit dem Python-Interpreter ausgeführt werden.

Barrierefreie Softwareentwicklung – Python-Programme ausführen

Für das Betriebssystem Windows kann eine Exe-Datei erstellt werden.
Dies funktioniert mit PyInstaller.
Da die Exe-Datei den Python-Interpreter beinhaltet, ist diese von der Dateigröße sehr groß.

Als Alternative zur ausführbaren Datei können Sie auch eine Batch-Datei erstellen und in dieser Batchdatei den Python-Interpreter und die entsprechende Python-Datei aufrufen.

Im Betriebssystem Ubuntu, kann eine .sh-Datei erstellt werden. In ihr wird Python und die Python-Datei aufgerufen. Außerdem muss dafür gesorgt werden, dass diese .sh-Datei ausführbar ist. Danach kann sie per Doppelklick gestartet werden.

Im Betriebssystem MacOS habe ich es leider nicht geschafft, eine ausführbare Datei zu erstellen. Das bedeutet, um ein Python-Programm in MacOS zu starten, rufen Sie Python + Python-Datei auf:
/Users/coz45/opt/anaconda3/bin/python /Users/coz45/Documents/PQTTexteditor.py

Schlussbemerkung

Sie merken es an der Ausführlichkeit des Blogartikels: Ich bin Fan von der Programmiersprache Python geworden. Barrierefreie Softwareentwicklung mit der Programmiersprache Python macht Spaß!

Ich werde die Entwicklung der Programmiersprache Java und C# weiterhin verfolgen, weil als Lehrbeauftragter und Gastdozent von Hochschulen und Universitäten muss ich mich mit diesen beiden Programmiersprachen auskennen und auf dem Laufenden sein.

Als Software-Entwickler des IT-Unternehmens Marlem-Software werde ich Python zur meiner Hauptprogrammiersprache machen und alle barrierefreien Programme die das IT-Unternehmen Marlem-Software entwickelt, werden in Zukunft in Python programmiert sein. Barrierefreie Software entwickeln die auf allen Betriebssystemen läuft ist mein beruflicher Lebenstraum.

Wenn Sie fragen zu obige Themen haben Schreiben Sie mir eine Mail an info@marlem-software.de oder rufen Sie mich an unter 07072/1278463 .


Autor: Markus Lemcke

Ich bin Markus Lemcke, Softwareentwickler, Webentwickler, Berater und Dozent für barrierefreies Webdesign, barrierefreie Softwareentwicklung mit Java + C#, Barrierefreiheit bei den Betriebssystemen Windows, Android, IOS und Ubuntu.

Schreibe einen Kommentar