Barrierefreie Anwendungen erstellen mit Qt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, wie ich geschrieben hatte, sind die Klassen überflüssig. Ich kann hier auch nirgends entdecken, dass jemand das "angewiesen" hätte. Wir sagten immer, Styles setzt man über Stylesheets.
Um unter Ubunutu den Default-Style von Buttons zu überschreiben braucht es noch

Code: Alles auswählen

QPushButton:focus { background-color: yellow; outline:none; border:none;}
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

@PythonMarlem: Das ist so nicht ganz richtig. Du hast gefragt, wie man auf Erhalt und Verlust des Focus reagieren kann. Dafür bräuchtest du die Klassen. Aber als du gezeigt hast, was du damit machen willst hat __blackjack__ dich sofort darauf hingewiesen, dass das das falsche Vorgehen ist.

Das ist übrigens ein häufig anzutreffendes Problem. Merke ich auch oft an mir selbst. Man hat ein Problem, glaubt zu wissen, wie es zu lösen ist, und fragt dann wie die Lösung umzusetzen ist. Dabei lässt man aber außer acht, dass die Lösung, die man für richtig hält, schon der falsche Weg sein könnte. Deshalb ist es nicht verkehrt, gleich von vornherein zu sagen, _warum_ man etwas machen möchte.

Für das, was du vor hast, sind die StyleSheets oder die Themes da.
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

In Ordnung und Danke!
Die Lösung von Euch funktioniert unter Windows 10 und Ubuntu.
Da die Anwendung nun fertig ist hier noch mal der Code:

Code: Alles auswählen

"""
**********************************************************************************************
* Mit Python und Qt eine Anwendung entwickeln die für Blinde und Sehbehinderte bedienbar ist *
**********************************************************************************************

Folgende Barrierefreie Kriterien demonstriert diese Anwendung:

1. Screenreadertauglichkeit
Screenreader ist eine Software die den Bildschirminhalt vorliest Blinde und auch
einige Sehbehinderte Menschen können nur Software bedienen die dem Screenreader
Texte übermitteln welche die Bedienelemente beschreiben.

In Java und C# werden Texte für Screenreader in der Eigenschaft "AccessibleDescription"
hinterlegt. Diese Eigenschaft gibt es auch in Qt. Leider wird sie im Betriebssystem
Windows von den Screenreadern NVDA und Jaws nicht ausgelesen.
Deswegen werden die Texte für Screenreader in der Eigenschaft "AccessibleName" hinterlegt.

Die Software wurde erfolgreich mit folgenden Screenreadern getestet:
NVDA, Betriebssystem Windows
Jaws, Betriebssystem Windows
Orca, Betriebssystem Ubuntu

2. Tastaturbedienbarkeit
Alle Bedienelemente sind per Tabulatortaste erreichbar. Die Schalter können per Entertaste ausgeführt.
Die Tastaturbedienbarkeit ist für blinde und sehbehinderte Menschen wichtig.
Zur Tastaturbedienbarkeit gehört auch das Beschriftung mit Eingabefelder verknüpft sind.
Das geht über die Labelmethode setBuddy.

3. 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.

"""

import os
import sys

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QSize


class MainWindow(QWidget):
    def __init__(self):
        # Konstruktor von QMainWindow aufrufen
        super().__init__()
        self.button_betriebssystem = QPushButton("Name des &Betriebssystem", self)
        self.button_anwender = QPushButton("Hallo &Anwender", self)
        self.label_vor_nachname = QLabel("&Vor-und Nachname:", self)
        self.edit_vor_nachname = QLineEdit(self)
        self.programm_beenden = QPushButton("&Ende", self)

        #Texte für Screenreader setzen
        self.button_betriebssystem.setAccessibleName("Es wird ausgegeben wie das Betriebssystem heißt")
        self.button_anwender.setAccessibleName("Der Anwender wird begrüßt")
        self.edit_vor_nachname.setAccessibleName("Geben Sie bitte Vor-und Nachname ein")
        self.programm_beenden.setAccessibleName("Progamm wird beendet")

        #Die Positionen wird in Zeilen und Spalten angegben
        self.layout_barrierefrei = QGridLayout()
        self.layout_barrierefrei.addWidget(self.button_betriebssystem, 0, 0)
        self.layout_barrierefrei.addWidget(self.button_anwender, 1, 0)
        self.layout_barrierefrei.addWidget(self.label_vor_nachname,2,0)
        self.layout_barrierefrei.addWidget(self.edit_vor_nachname,2,1)
        self.layout_barrierefrei.addWidget(self.programm_beenden,3,0)
        self.setLayout(self.layout_barrierefrei)

        # Fenstergröße und Titel einstellen
        self.setMinimumSize(QSize(450, 350))
        self.setWindowTitle('Barrierefreiheit mit Python und Qt')
        self.showNormal()

        # self.button_betriebssystem.setGeometry(100, 10, 170, 60)
        self.button_betriebssystem.setToolTip("Es wird ausgegeben wie das Betriebssystem heißt")
        self.button_betriebssystem.clicked.connect(self.betriebssystem_abfragen)

        self.button_anwender.setToolTip("Der Anwender wird begrüßt")
        self.button_anwender.clicked.connect(self.benutzergruessen)

        self.edit_vor_nachname.setToolTip("Geben Sie Vor-und Nachname ein")
        self.edit_vor_nachname.setText("Markus Lemcke")

        # 2. Tastaturbedienbarkeit
        self.label_vor_nachname.setBuddy(self.edit_vor_nachname)

        self.programm_beenden.setToolTip("Programm Beenden")
        self.programm_beenden.clicked.connect(self.close)

    def betriebssystem_abfragen(self):
        os_info = sys.platform
        print("Betriebssytem: " + os_info)

    def benutzergruessen(self):
        Text = "Guten Tag " + self.edit_vor_nachname.text()
        print(Text)


def main():
    app = QtWidgets.QApplication([])
    # 3. Visuelle und programmgesteuerte Anzeige der Position des Tastaturfokus
    app.setStyleSheet("""
    QPushButton:focus { background-color: yellow }
    QLineEdit:focus { background-color: yellow }
    """);
    win = MainWindow()
    win.showNormal()
    app.exec_()

if __name__ == '__main__':
    main()
V I E L E N D A N K F Ü R E U R E H I L F E
Benutzeravatar
__blackjack__
User
Beiträge: 13999
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Von den Klassen habe ich auch schon vor Deiner Implementierung und ohne zu wissen was damit erreicht werden soll abgeraten, denn ich habe ja *zwei* Möglichkeiten genannt, Klassen ableiten oder `QObject.installEventFilter()`, und gegen Ableiten und für `installEventFilter()` argumentiert. Das wäre für etwas das man mit Stylesheets erreichen kann auch immer noch der falsche Weg, aber es war halt auch nie eine ”Anweisung” Klassen abzuleiten.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Jetzt wäre es noch gut, wenn nicht die Informationen zu einem Button in der ganzen __init__ verstreut wären, sondern direkt untereinander stehen.
Antworten