Topics

Speak the Contents of a wx.StaticText Control When It Changes

Thomas Stivers
 

All,

I am working on an application using wxpython. I would like to have NVDA speak the contents of either a wx.StaticText or wx.TextCtrl when the text changes. Is there a way to do this wouthout the application actively calling a function from NVDA or the controller dll? I've tried using Refresh() and Update() on the controls, but I still have to take action for NVDA to tell me about the change.

Any thoughts would be appreciated.

Thomas

Abdel
 

Hi Thomas,

Try winUser.NotifyWinEvent, it's used in the source/gui/nvdaControls.py module to give the states of the checkboxes.

Every time you update your wx.StaticText or wx.TextCtrl, you can use for example:

import winUser
winUser.NotifyWinEvent(winUser.EVENT_OBJECT_VALUECHANGE, self.Handle, winUser.OBJID_CLIENT, indexOfYourTextCtrl)


Hope this helps.

Kind regards,
Abdel.


Le 13/04/2019 à 03:34, Thomas Stivers a écrit :
All,

I am working on an application using wxpython. I would like to have NVDA speak the contents of either a wx.StaticText or wx.TextCtrl when the text changes. Is there a way to do this wouthout the application actively calling a function from NVDA or the controller dll? I've tried using Refresh() and Update() on the controls, but I still have to take action for NVDA to tell me about the change.

Any thoughts would be appreciated.

Thomas

James Scholes
 

There are a number of possible solutions here, but none of them do what you're directly asking for. NVDA doesn't speak changes to static text controls by default and there's no way for your application to force it to do so.

In terms of NVDA-specific solutions, you can use the NVDA Controller Client as you've mentioned or bundle an NVDA add-on with your program. There are other screen readers out there, so you risk excluding other users with these approaches.

Consider modifying the program itself to communicate the information in a different way. For example, if the static text changes are reporting that some sort of processing has begun, open a progress dialog. Alternatively, AFAIK NVDA will always report label changes for the focused control, so as a hacky solution you could just put the text on a button. Static texts don't appear in the tab order, so don't force the user's focus onto those.

Regards,

James Scholes

On 12/04/2019 at 8:34 pm, Thomas Stivers wrote:
All,
I am working on an application using wxpython. I would like to have NVDA speak the contents of either a wx.StaticText or wx.TextCtrl when the text changes. Is there a way to do this wouthout the application actively calling a function from NVDA or the controller dll? I've tried using Refresh() and Update() on the controls, but I still have to take action for NVDA to tell me about the change.
Any thoughts would be appreciated.
Thomas