- wxPython - Home
- wxPython - Introduction
- wxPython - Environment
- wxPython - Hello World
- wxPython - GUI Builder Tools
- wxPython - Major Classes
- wxPython - Event Handling
- wxPython - Layout Management
- wxPython - Buttons
- wxPython - Dockable Windows
- Multiple Document Interface
- wxPython - Drawing API
- wxPython - Drag and Drop
wxPython - TextCtrl Class
In a GUI interface, the input is most commonly collected in a text box where the user can type using the keyboard. In wxPython, an object of wx.TextCtrl class serves this purpose. It is a control in which the text can be displayed and edited. The TextCtrl widget can be a single line, multi-line or a password field. TextCtrl class constructor takes the following form −
wx.TextCtrl(parent, id, value, pos, size, style)
The style parameter takes one or more constants from the following list −
| S.N. | Parameters & Description |
|---|---|
| 1 |
wx.TE_MULTILINE The text control allows multiple lines. If this style is not specified, the line break characters should not be used in the controls value. |
| 2 |
wx.TE_PASSWORD The text will be echoed as asterisks |
| 3 |
wx.TE_READONLY The text will not be user-editable |
| 4 |
wxTE_LEFT The text in the control will be left-justified (default) |
| 5 |
wxTE_CENTRE The text in the control will be centered |
| 6 |
wxTE_RIGHT The text in the control will be right-justified |
The important methods of wx.TextCtrl class are −
| S.N. | Methods & Description |
|---|---|
| 1 |
AppendText() Adds text to the end of text control |
| 2 |
Clear() Clears the contents |
| 3 |
GetValue() Returns the contents of the text box |
| 4 |
Replace() Replaces the entire or portion of text in the box |
| 5 |
SetEditable() Makes the text box editable or read-only |
| 6 |
SetMaxLength() Sets maximum number of characters the control can hold |
| 7 |
SetValue() Sets the contents in the text box programmatically |
| 8 |
IsMultiLine() Returns true if set to TE_MULTILINE |
The following event binders are responsible for event handling related to entering text in TextCtrl box −
| S.N. | Events & Description |
|---|---|
| 1 |
EVT_TEXT Responds to changes in the contents of text box, either by manually keying in, or programmatically |
| 2 |
EVT_TEXT_ENTER Invokes associated handler when Enter key is pressed in the text box |
| 3 |
EVT_TEXT_MAXLEN Triggers associated handler as soon as the length of text entered reaches the value of SetMaxLength() function |
Example
In the following example, four objects of wx.TextCtrl class with different attributes are placed on the panel.
self.t1 = wx.TextCtrl(panel) self.t2 = wx.TextCtrl(panel,style = wx.TE_PASSWORD) self.t3 = wx.TextCtrl(panel,size = (200,100),style = wx.TE_MULTILINE) self.t4 = wx.TextCtrl ( panel, value = "ReadOnly Text", style = wx.TE_READONLY | wx.TE_CENTER )
While the first is a normal text box, the second is a password field. The third one is a multiline text box and the last text box is non-editable.
EVT_TEXT binder on first box triggers OnKeyTyped() method for each key stroke in it. The second box is having its MaxLength set to 5. EVT_TEXT_MAXLEN binder sends OnMaxLen() function running as soon as the user tries to type more than 5 characters. The multiline text box responds to Enter key pressed because of EVT_TEXT_ENTER binder.
The complete code is as follows −
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (350,250))
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
l1 = wx.StaticText(panel, -1, "Text Field")
hbox1.Add(l1, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
self.t1 = wx.TextCtrl(panel)
hbox1.Add(self.t1,1,wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
self.t1.Bind(wx.EVT_TEXT,self.OnKeyTyped)
vbox.Add(hbox1)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
l2 = wx.StaticText(panel, -1, "password field")
hbox2.Add(l2, 1, wx.ALIGN_LEFT|wx.ALL,5)
self.t2 = wx.TextCtrl(panel,style = wx.TE_PASSWORD)
self.t2.SetMaxLength(5)
hbox2.Add(self.t2,1,wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
vbox.Add(hbox2)
self.t2.Bind(wx.EVT_TEXT_MAXLEN,self.OnMaxLen)
hbox3 = wx.BoxSizer(wx.HORIZONTAL)
l3 = wx.StaticText(panel, -1, "Multiline Text")
hbox3.Add(l3,1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
self.t3 = wx.TextCtrl(panel,size = (200,100),style = wx.TE_MULTILINE)
hbox3.Add(self.t3,1,wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
vbox.Add(hbox3)
self.t3.Bind(wx.EVT_TEXT_ENTER,self.OnEnterPressed)
hbox4 = wx.BoxSizer(wx.HORIZONTAL)
l4 = wx.StaticText(panel, -1, "Read only text")
hbox4.Add(l4, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
self.t4 = wx.TextCtrl(panel, value = "ReadOnly
Text",style = wx.TE_READONLY|wx.TE_CENTER)
hbox4.Add(self.t4,1,wx.EXPAND|wx.ALIGN_LEFT|wx.ALL,5)
vbox.Add(hbox4)
panel.SetSizer(vbox)
self.Centre()
self.Show()
self.Fit()
def OnKeyTyped(self, event):
print event.GetString()
def OnEnterPressed(self,event):
print "Enter pressed"
def OnMaxLen(self,event):
print "Maximum length reached"
app = wx.App()
Mywin(None, 'TextCtrl demo')
app.MainLoop()
The above code produces the following output −