Barrierefreie Anwendungen erstellen mit Qt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Hallo,

in einem Lernvideo habe ich gesehen, dass Qt-Oberflächenkomponenten
die Eigenschaften "AccessibleName" und "AccessibleDescription" haben.
Das deutet darauf hin dass eine Qt-Anwendungen screenreadertauglich
entwickelt werden kann. In den Programmiersprachen Java und C# heißen
die Eigenschaften genauso.

Frage:
Gibt es dazu Dokumentation?
Benutzeravatar
sparrow
User
Beiträge: 4361
Registriert: Freitag 17. April 2009, 10:28

Warum schaust du nicht mal in die Qt-Dokumentation?
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

weil meine erste Frage in diesem Forum bezieht sich auf Installation von Qt unter Windows 10.
Wenn ich es geschafft habe, dass ich Qt unter Windows 10 installieren kann, dann kann ich auch in der Dokumentation nachschauen.
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PythonMarlem: Die Qt-Dokumentation gibt es auch online zum Lesen.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Schön, aber wenn ich im ersten Posting schreibe, dass ich gerade Python lerne, weiß ich das nicht! Aber ich suche sie jetzt!
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Dieser Link ist nicht wirklich hilfreich:
https://doc.qt.io/qtforpython/PySide2/Q ... escription
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PythonMarlem: Nimm die Qt-Dokumentation. Also die für C++, nicht die für Python/PySide2. Und da dann am besten nicht nur die konkreten Methoden und Properties sondern auch mal die Übersichtsdokumentationen zu den verschiedenen Themen wie „Accessibility“.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Wobei hier die speziell fur Accessibility ist: https://doc.qt.io/qt-5/accessible.html
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Vielen Dank! sieht sehr gut aus!
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Hallo,

der Grund warum ich in die Irre gelaufen bin ist, dass es unter Windows einen Bug gibt. Ob der Bug bei Qt oder beim Screenreader NVDA ist muss ich noch herausfinden.

Folgender Code funktioniert unter Ubuntu 20.04 mit dem Screenreader Orca der in Ubuntu in den Zugangshilfen zu finden ist:

Code: Alles auswählen

#!/usr/bin/env python3
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QSize

class MyWindow(QMainWindow):
    def __init__(self):
        # Konstruktor von QMainWindow aufrufen
        super().__init__()

        # Fenstergröße und Titel einstellen
        self.setMinimumSize(QSize(300, 100))
        self.setWindowTitle('Barrierefreiheit mit Qt')

        def sag_HalloWindows():
            print("Hallo Windows!")

        def sag_HalloUbuntu():
            print("Hallo Ubuntu!")

        vButtonWindows = QPushButton("Hallo Windows",self)
        vButtonWindows.setGeometry(0,0,80,30)
        vButtonWindows.setAccessibleDescription("Es wird ein Hallo Windows auf der Console ausgeben")
        vButtonWindows.clicked.connect(sag_HalloWindows)
        vButtonWindows.show()

        vButtonUbuntu = QPushButton("Hallo Ubuntu!",self)
        vButtonUbuntu.setGeometry(0, 50,80,30)
        vButtonUbuntu.setAccessibleDescription("Es wird ein Hallo Ubuntu auf der Console ausgeben")
        vButtonUbuntu.clicked.connect(sag_HalloUbuntu)
        vButtonUbuntu.show()

app = QtWidgets.QApplication([])
win = MyWindow()
win.show()
app.exec_()
Folgender Code funktioniert unter Windows 10 mit dem kostenlosen Screenreader http://nvda.bhvd.de/

Code: Alles auswählen

#!/usr/bin/env python3
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QSize

class MyWindow(QMainWindow):
    def __init__(self):
        # Konstruktor von QMainWindow aufrufen
        super().__init__()

        # Fenstergröße und Titel einstellen
        self.setMinimumSize(QSize(300, 100))
        self.setWindowTitle('Barrierefreiheit mit Qt')

        def sag_HalloWindows():
            print("Hallo Windows!")

        def sag_HalloUbuntu():
            print("Hallo Ubuntu!")

        vButtonWindows = QPushButton("Hallo Windows",self)
        vButtonWindows.setGeometry(0,0,80,30)
        vButtonWindows.setAccessibleName("Es wird ein Hallo Windows auf der Console ausgeben")
        vButtonWindows.clicked.connect(sag_HalloWindows)
        vButtonWindows.show()

        vButtonUbuntu = QPushButton("Hallo Ubuntu!",self)
        vButtonUbuntu.setGeometry(0, 50,80,30)
        vButtonUbuntu.setAccessibleName("Es wird ein Hallo Ubuntu auf der Console ausgeben")
        vButtonUbuntu.clicked.connect(sag_HalloUbuntu)
        vButtonUbuntu.show()

app = QtWidgets.QApplication([])
win = MyWindow()
win.show()
app.exec_()
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PythonMarlem: Muss das denn überhaupt ein Bug sein? Ist vielleicht auch einfach nur ein Unterschied in den Screenreadern. Eventuell sogar konfigurierbar.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Ja, es ist ein Bug!
Bei C# Winform, WPF und bei Java-Swing, JavaFX gibt es auch die Eigenschaften für Screenreader.
Hier ist klar geregelt dass wenn bei AccessibleDescription ein Text hinterlegt ist, wird der Text vom Screenreader gelesen.
Habe ich alles 4 getestet mit NVDA.

Aber um mein Problem nochmal zu konkretisieren:
Wenn ich in der Eigenschaft AccessibleDescription einen Text hinterleg für den Screenreader, dann ist die Python-Anwendung für Windows-Nutzer die den Screenreader NVDA nutzen nicht bedienbar und für Ubuntu-Nutzer die den Screenreader Orca verwenden ist sie bedienbar.
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Ich habe folgendes gemacht. Ich habe die Demo-Version von diesem Screenreader unter Windows 10 installiert:
https://support.freedomscientific.com/Downloads/JAWS

Genau das gleiche!

Code: Alles auswählen

vButtonWindows.setAccessibleDescription("Es wird ein Hallo Windows auf der Console ausgeben")
Liest der Screenreader Jaws nicht, obwohl AccessibleDescription die richtige Eigenschaft ist.

Code: Alles auswählen

vButtonWindows.setAccessibleName("Es wird ein Hallo Windows auf der Console ausgeben")
Liest der Screenreader Jaws obwohl diese Eigenschaft AccessibleName nicht dafür vorgesehen ist!
Benutzeravatar
sparrow
User
Beiträge: 4361
Registriert: Freitag 17. April 2009, 10:28

Woher nimmst du die Information, wofür was vorgesehen ist?
Benutzeravatar
sparrow
User
Beiträge: 4361
Registriert: Freitag 17. April 2009, 10:28

Die Informationen in der Qt Dokumentation sagen , dass in "Description" nur Informationen über das Aussehen des Widgets stehen sollen. Dann würden die Reader unter Windows funktionieren, wie sie sollen.

Gibt es denn irgendwo ein Dokument, was ein Screenreader auswerten muss? Irgend ein Standard? Und möchte ein Benutzer überhaupt immer eine lange Version hören?
"OK" in einem Dialog macht ja mehr Sinn als "Dieser Knopf bestätigt den Dialog mit der Antwort OK".
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Das Entscheidende kommt danach:
The description is primarily used to provide greater context for vision-impaired users, but is also used for context searching or other applications.
Die Sache ist die, bei Java und C# heißen die Eigenschaften genau gleich und dort wird auch immer AccessibleDescription genutzt um ein Bedienelement zu beschreiben.
Benutzeravatar
sparrow
User
Beiträge: 4361
Registriert: Freitag 17. April 2009, 10:28

Aber das aus anderen Sprachen und Tookits abzuleiten halte ich für schwierig.
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Folgender Code:

Code: Alles auswählen

#*******************************************************************************
#*              Mit Python und Qt eine Screenreadertaugliche Anwendung         *
#*******************************************************************************

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

class MyWindow(QMainWindow):
    def __init__(self):
        # Konstruktor von QMainWindow aufrufen
        super().__init__()

        # Fenstergröße und Titel einstellen
        self.setMinimumSize(QSize(300, 100))
        self.setWindowTitle('Barrierefreiheit mit Qt')
        self.setGeometry(50,50,300,100)

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

        def HalloAnwender():
            print("Hallo Markus!")

        vButtonBetriebssystem = QPushButton("Hallo Betriebssystem",self)
        vButtonBetriebssystem.setGeometry(20,0,130,30)
        vButtonBetriebssystem.setAccessibleName("Es wird ausgegeben wie das Betriebssystem heißt")
        vButtonBetriebssystem.setToolTip("Es wird ausgegeben wie das Betriebssystem heißt")
        vButtonBetriebssystem.clicked.connect(BetriebbsystemAbfragen)
        vButtonBetriebssystem.show()

        vButtonAnwender = QPushButton("Hallo Anwender",self)
        vButtonAnwender.setGeometry(20, 40, 130, 30)
        vButtonAnwender.setAccessibleName("Der Anwender wird begrüßt")
        vButtonAnwender.setToolTip("Der Anwender wird begrüßt")
        vButtonAnwender.clicked.connect(HalloAnwender)
        vButtonAnwender.show()

app = QtWidgets.QApplication([])
win = MyWindow()
win.show()
app.exec_()
Hat unter Windows 10 mit dem Screenreader NVDA funktioniert und unter Ubuntu mit dem Screenreader Orca.

Wenn Ihr als Python-Experten sagt, dass das eine gute Lösung ist, dann lasse ich es jetzt auf sich beruhen!
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Hier: https://doc.qt.io/qt-5/qwidget.html#acc ... ption-prop

Die Definition bestätigt meine Behauptung.
Antworten