Below is the text of my original post about Layout by Code for Python. Examples of its use are also included in the source code for McTwit
http://EmpowermentZone.com/mtsetup.exe or .zip Sizers can definately be used to create accessible GUIs. Hope this helps, Jamal From the archive at http://EmpowermentZone.com/pyLbc.zipI have developed a Python module called Layout by Code (lbc), which simplifies design of dialogs with the wxPython package available from
http://wxPython.orgThis is another implementation of the Layout by Code approach that I originally developed for the AutoIt language,
http://EmpowermentZone.com/lbc.zipAlthough the Python version is not as flexible, it is still intended to support most dialogs one might need (based on years of experience with various applications and languages). It should work with Python 2.4, 2.5, or 2.6.
After instantiating an lbc dialog object, any of the following controls may be added with a line of code: Button, CheckBox, ListBox, RadioButton, RichEdit, StaticText, or TextCtrl. The control is added to a horizontal band of controls, with layout automatically managed by wxSizer containers. Adding a new band is analagous to pressing carriage return at the end of a line.
The lbc ShowModal method adds a band of buttons at the bottom of the dialog before invoking it. The method returns the ID of the button that ended the dialog. At that point, the dialog object has a list attribute called Controls, containing the names of controls that were added to the dialog before it was invoked. A control name is its class and label, if any, seperated by an underscore, e.g., Button_OK. The dialog also has a dictionary attribute called Results, containing the control names and values when the dialog ended.
Over ten convenience dialogs have been defined using lbc, illustrated with the program test_lbc.py. Also, a fruit basket program is in lbc_fruit.py.
Below is a summary of lbc functions, followed by the fruit basket example.
Jamal DialogBrowseForFolder(message='', value='') -- Select a folder DialogChoose(title='Choose', message = '', names=[]) -- Choose a buttonDialogConfirm(title='Confirm', message='', value='Y') -- Choose from a Yes/No/Cancel message box
DialogInput(title='Input', label='', value='', ) -- Input with a single-line edit box
DialogMemo(title='Memo', label='', value='', readonly=False) -- Input or read text with a multiple-line edit box
DialogMultiInput(title='MultiInput', labels=[], values=[], options=[]) -- Input with multiple edit boxes
DialogMultiPick(title='Multi Pick', message='', names=[], values=[], sort=False, index=0) -- Pick from a multiple-selection listbox
DialogOpenFile(message='', value='', wildcard='All files (*.*)|*.*') -- Specify a file to open
DialogPick(title='Pick', message='', names=[], values=[], sort=False, index=0) -- Pick from a single-selection listbox
DialogSaveFile(message='', value='', wildcard='All files (*.*)|*.*') -- Specify a file to save
DialogShow(title='Show', message='') -- Show a message AddBand(self) AddButtonBand(buttons=[], handler=None)AddButton(label='', pos=wx.DefaultPosition, size=wx.DefaultSize, style=DEFAULT_STYLE, name='')
AddCheckBox(label='', value=False, pos=wx.DefaultPosition, size=wx.DefaultSize, style=DEFAULT_STYLE, name='')
AddListBox(label='', names=[], values=[], sort=False, pos=wx.DefaultPosition, size=wx.DefaultSize, style=DEFAULT_STYLE, name='')
AddRadioButton(label='', value=False, pos=wx.DefaultPosition, size=wx.DefaultSize, style=DEFAULT_STYLE, name='')
AddRichEdit(label='', value='', readonly=False, pos=wx.DefaultPosition, size=wx.DefaultSize, style= wx.TE_MULTILINE | wx.TE_PROCESS_ENTER | wx.TE_RICH2, name='')
AddStaticText(label='', pos=wx.DefaultPosition, size=wx.DefaultSize, style=DEFAULT_STYLE, name='')
AddTextCtrl(label='', value='', pos=wx.DefaultPosition, size=wx.DefaultSize, style=DEFAULT_STYLE, name='')
ShowModal(buttons = ['OK', 'Cancel'], handler=None) """ Fruit basket program in Python with lbc Public domain by Jamal Mazrui """ import wx, lbc # Custom event handler def OnEvent(dlg, event): if event.GetEventType() in wx.EVT_CLOSE.evtType:if lbc.DialogConfirm(title='Confirm', message='Exit program?', value='Y') == 'Y': return event.Skip()
else: return event.Veto() wgt = event.GetEventObject() txt = dlg.FindWindowByName('TextCtrl_Fruit') lst = dlg.FindWindowByName('ListBox_Basket') if wgt.GetName() == 'Button_Add': fruit = txt.GetValue()if len(fruit) == 0: return lbc.DialogShow(title='Alert', message='No fruit to add!')
lst.Append(fruit) index = lst.GetCount() - 1 lst.SetSelection(index) txt.Clear() elif wgt.GetName() == 'Button_Delete': index = lst.GetSelection()if index == -1: return lbc.DialogShow(title='Alert', message='No fruit to delete!')
lst.Delete(index) if index == lst.GetCount(): index -= 1 if index >= 0: lst.SetSelection(index) # Main program app = lbc.App() dlg = lbc.Dialog(title='Fruit Basket') dlg.AddTextCtrl(label='Fruit:') dlg.AddListBox(label='Basket:') dlg.ShowModal(buttons=['Add', 'Delete'], handler=OnEvent) app.Exit()On Wed, 10 Mar 2010, Alex Hall wrote:
Date: Wed, 10 Mar 2010 12:07:56 -0500 From: Alex Hall <mehgcap@xxxxxxxxx> Reply-To: programmingblind@xxxxxxxxxxxxx To: programmingblind <programmingblind@xxxxxxxxxxxxx> Subject: making GUI with WXPython Hi all, I am working on an options dialog for a program written in Python2.6. I am using WXPython and XRC (created with the XRCed editor). I am getting lost in all the position and size numbers, though. I seem to remember Jamal had something about "layout by code" and I wondered if that would be useable here? Or, if I use wx.sizers, can they position the elements for me? Also, if I use sizers, will screen readers be able to read the label in one sizer as the prompt for the text box in another sizer? I remember someone on here telling me that screen readers read labels for text boxes if the label and text box touch by one or more pixels, and I am not sure how I would use a sizer to overlap these widgets like that. Suggestions? Thanks! -- Have a great day, Alex (msg sent from GMail website) mehgcap@xxxxxxxxx; http://www.facebook.com/mehgcap __________ View the list's information and change your settings at //www.freelists.org/list/programmingblind
__________View the list's information and change your settings at //www.freelists.org/list/programmingblind