wxpython - wx.html2.WebView 和屏幕阅读器

标签 wxpython accessibility

在 wxPython 4.0 Phoenix 中,我尝试将 wx.html2.WebView 与屏幕阅读器一起使用。

无论是使用 JAWS 还是 NVDA,我都必须在小部件上单击鼠标左键才能在可访问的 Web 界面中查看我的页面。

这是我的代码,但请注意我在使用 LoadURL 方法时遇到了同样的问题。

我是否应该添加一些内容,以便在显示小部件时焦点直接位于 Web 界面中?

预先感谢您的回答。

import wx
import wx.html2

class MyWebView (wx.Dialog):

    def __init__(self, parent):
        wx.Dialog.__init__(self, parent)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.browser = wx.html2.WebView.New(self)
        self.changeBtn = wx.Button (self, -1, label="Change page")

        # The pages that I want to display disposed in a tuple.
        self.pages = (
        "<html><head><title>Hello everyone !</title></head><body><h1>We're testing wx.html2.WebView with a Screen Reader !</h1></body></html>",
        "<html><head><title>Second page !</title></head><body><h1>This is a second page</h1></body></html>",
        "<html><head><title>Third page !</title></head><body><h1>This is a third page</h1></body></html>"
        )

        self.index = 0
        self.display = self.pages[self.index]
        sizer.Add(self.browser, 1, wx.EXPAND, 10)
        sizer.Add(self.changeBtn)
        self.SetSizer(sizer)
        self.SetSize((700, 700))

    # Events.
        self.changeBtn.Bind (wx.EVT_BUTTON, self.onChangePage)

    def onChangePage (self, evt):
        self.index += 1
        if self.index == len (self.pages):
            self.index = 0
        self.display = self.pages[self.index]
        self.browser.SetPage(self.display, "")

if __name__ == '__main__':
    app = wx.App()
    dialog = MyWebView (None)
    dialog.browser.SetPage(dialog.display, "")
    dialog.Show ()
    app.MainLoop()

亲切的问候。

最佳答案

在 Windows 下,由于 Internet Explorer Server 的一个奇怪错误,您实际上需要单击小部件中的某个位置,以便屏幕阅读器可以与其交互。 一旦进行了初始点击,屏幕阅读器就可以与该小部件完美配合。

请注意,在 C++ 中最新的 wxWidgets 3.1.3 中仍然会出现同样的问题。 事实上,wxWidgets 和 wxPython 都不会对这个错误负责。当直接使用 ActiveX 和 Win32 API 嵌入 Internet Explorer Server 时也会发生这种情况。

您可以生成所需的初始鼠标单击,以便可以通过如下方式访问小部件:

robot = wx.UIActionSimulator() 
self.browser.SetFocus() 
position = self.browser.GetPosition() 
position = self.browser.ClientToScreen(position) 
robot.MouseMove(position) 
robot.MouseClick() 

wx.UIActionSimulator是一个类,允许像机器人一样生成用户事件。通常它用于演示、UI 自动化测试或重播录制的宏。 这里我们用它来进行所需的鼠标点击。 类似的解决方案也适用于 C++。

  1. 我们将焦点设置到小部件
  2. 我们得到它相对于窗口的左上角位置
  3. UIActionSimulator需要绝对屏幕坐标,因此我们需要转换位置
  4. 我们移动鼠标并点击

通过单击小部件的最左上角的点,不太可能产生不良效果,但并非完全不可能。

关于wxpython - wx.html2.WebView 和屏幕阅读器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55345724/

相关文章:

python - wxPython:BoxSizer 中的项目不会水平扩展,只会垂直扩展

python - wxPython - 如何在另一个进程发生时显示加载栏?

python - wxPython:禁用笔记本选项卡?

android - 使用自定义textview的字体图标的可访问性

html - 无标签的辅助功能和单选按钮

UITableView 部分的 ios 画外音

python - 多个 wx.Yield() 替代方案

python - 测量器... - wxPython

android - 在 android 中开启回话时,字符串被读取为数字而不是逐位读取

macos - 如何让 Mac Voiceover 将数字读取为数字而不是单个数字?