WxPython Book — Code Section Inventory

Read Me2 fragments

Fragment 1 of 2
class wx.Panel(Window)
Possible constructors:

__init__(self, parent, id=ID_ANY, pos=DefaultPosition,
         size=DefaultSize, style=TAB_TRAVERSAL,
         name=PanelNameStr) -> None
Fragment 2 of 2
panel = wx.Panel(parent=parent)

1.2 Installing WxPython6 fragments

Fragment 1 of 6
pip install -U wxpython
Fragment 2 of 6
import wx
Fragment 3 of 6
xcode-select --install
Fragment 4 of 6
pip install -U wxPython
Fragment 5 of 6
python3 -m pip install wxPython
py -3.12 -m pip install wxPython
Fragment 6 of 6
import wx
print(wx.version())

1.3 Using an IDE1 fragment

Fragment 1 of 1
python -c "import sys; print(sys.executable)"

2.1.1 Hello World1 fragment

Fragment 1 of 1
import wx

app = wx.App()
frame = wx.Frame(None, title="First wx program")
panel = wx.Panel(frame)
text = wx.StaticText(panel, label ="Hello World")

frame.Show()
app.MainLoop()

2.1.3 First Practical Example12 fragments

Fragment 1 of 12
import wx

class ClickCounter(wx.Frame):
    def __init__(self):
        super().__init__(None, title='Click Counter',
                         size = (175, 90))
        self.clicks = 0

        frame_sizer = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.SetSizer(frame_sizer)

        # Make a panel and add it to the frame's sizer
        panel = wx.Panel(self)
        panel_sizer = wx.BoxSizer(orient=wx.VERTICAL)
        panel.SetSizer(panel_sizer)
        frame_sizer.Add(panel)

        # Make some widgets--first, a button
        button = wx.Button(panel, label='Click Me')
        panel_sizer.Add(button, flag=wx.ALL, border=5)
        button.Bind(wx.EVT_BUTTON, self.handle_button)
        
        # Next, a "static text" widget
        self.text = wx.StaticText(panel,
                            label='No clicks so far.')
        panel_sizer.Add(self.text)

    def handle_button(self, event):
        self.clicks += 1
        self.text.SetLabel('Clicks so far: ' +
                           str(self.clicks))

if __name__ == '__main__':
    app = wx.App()
    ClickCounter().Show()
    app.MainLoop()
Fragment 2 of 12
import wx
class ClickCounter(wx.Frame):
     def __init__(self):
        super().__init__(None, title='Click Counter',
                         size = (175, 90)
Fragment 3 of 12
self.clicks = 0
Fragment 4 of 12
frame_sizer = wx.BoxSizer(orient=wx.HORIZONTAL)
self.SetSizer(frame_sizer)
Fragment 5 of 12
panel = wx.Panel(self)
frame_sizer.Add(panel)
Fragment 6 of 12
panel_sizer = wx.BoxSizer(orient=wx.VERTICAL)
panel.SetSizer(panel_sizer)
Fragment 7 of 12
button = wx.Button(panel, label='Click Me')
Fragment 8 of 12
panel_sizer.Add(button, flag=wx.ALL, border=5)
Fragment 9 of 12
button.Bind(wx.EVT_BUTTON, self.handle_button)
Fragment 10 of 12
# Next, a "static text" widget
self.text = wx.StaticText(panel,
                          label='No clicks yet.')
self.text.SetMinSize((120, -1))
panel_sizer.Add(self.text, flag=wx.ALL, border=5)
Fragment 11 of 12
def handle_button(self, event):
    self.clicks += 1
    self.text.SetLabel('Clicks so far: ' +
                       str(self.clicks))
Fragment 12 of 12
if __name__ == '__main__':
    app = wx.App()
    ClickCounter().Show()
    app.MainLoop()

2.1.4 Program Skeleton1 fragment

Fragment 1 of 1
import wx

class MyGui(wx.Frame):

    def __init__(self):
        super().__init__(None, title='My GUI')

        # Make a sizer for MyGui, and call SetSizer

        # Make one or more panels, and for each one,
        # make a sizer and connect it to the panel.

        # Add each panel to the sizer for the GUI.

        # Make some widgets and add each one to the
        # sizer for some panel.
       
        # Bind functions to widgets.

    # Define functions to be called by widgets.

    def function_name(self, event):
        # Code to handle event

if __name__ == '__main__':
    app = wx.App()
    MyGui().Show()
    app.MainLoop()

2.1.7 A Note on Formatting3 fragments

Fragment 1 of 3
slider = wx.Slider(panel_2,
                   value = 50,
                   minValue = 0,
                   maxValue = 100,
                   size = (200, 50),
                   style = wx.SL_HORIZONTAL)
Fragment 2 of 3
slider = wx.Slider(panel_2, value = 50, minValue = 0,
                   maxValue = 100, size = (200, 50),
                   style = wx.SL_HORIZONTAL)
Fragment 3 of 3
slider = wx.Slider(
    panel_2, value=50, minValue=0, maxValue=100,
    size=(200, 50), style=wx.SL_HORIZONTAL)

2.1.8 Widgets in Brief15 fragments

Fragment 1 of 15
label = wx.StaticText(parent, label=text)
Fragment 2 of 15
button = wx.Button(parent, label=label)
button.Bind(wx.EVT_BUTTON, handler)
Fragment 3 of 15
ctrl = wx.TextCtrl(parent)
text = ctrl.GetValue()
Fragment 4 of 15
ctrl = wx.TextCtrl(parent, style=wx.TE_MULTILINE)
text = ctrl.GetValue()
text = ctrl.GetLineText(lineNo)
ctrl.SetValue(text)
Fragment 5 of 15
ctrl = wx.TextCtrl(parent, style=wx.TE_PASSWORD)
text = ctrl.GetValue()
Fragment 6 of 15
checkbox = wx.CheckBox(parent, label=text)
boolean = checkbox.GetValue()
Fragment 7 of 15
radio = wx.RadioButton(parent, label=text)
boolean = radio.GetValue()
Fragment 8 of 15
path = path_to_image_file
bmp = wx.Bitmap(path, wx.BITMAP_TYPE_ANY)
static_bitmap = wx.StaticBitmap(parent, bitmap=bmp)
Fragment 9 of 15
combo = wx.ComboBox(parent, choices=list_of_strings)
text = combo.GetValue()
Fragment 10 of 15
listbox = wx.ListBox(parent, choices=list_of_strings)
index = listbox.GetSelection()
if index >= 0:
    text = listbox.GetString(index)
Fragment 11 of 15
slider = wx.Slider(parent)
value = slider.GetValue()
slider.SetValue(value)
Fragment 12 of 15
panel = wx.Panel(parent)
Fragment 13 of 15
ok_button = wx.Button(label='OK', parent=panel_2)
Fragment 14 of 15
Add(self, window, proportion=0, flag=0, border=0, userData=None)
my_sizer.Add(ok_button, border=5)
Fragment 15 of 15
my_button.Add(panel_2) # illegal

2.1.9 Static Bitmaps / 3.10.3 Images2 fragments

Fragment 1 of 2
path = path_to_image_file
bmp = wx.Bitmap(path, wx.BITMAP_TYPE_ANY)
static_bitmap = wx.StaticBitmap(parent, bitmap=bmp)

sizer.Add(static_bitmap)
Fragment 2 of 2
path = path_to_image_file
img = wx.Image(path, wx.BITMAP_TYPE_ANY)

# Rotate image around center point
(w, h) = (img.GetWidth() // 2, img.GetHeight() // 2)
img = img.Rotate(angle=0.5,
                 rotationCentre=wx.Point(w, h))
bmp = wx.Bitmap(img)
static_bitmap = wx.StaticBitmap(panel, bitmap=bmp)
sizer.Add(static_bitmap)

2.1.10 Sizers in Brief16 fragments

Fragment 1 of 16
widget = wx.WidgetType(parent, other_args)
Fragment 2 of 16
frame = wx.Frame(None, title=title,
                 size=(width, height)))
Fragment 3 of 16
frame_sizer = wx.BoxSizer(orient=wx.HORIZONTAL)
frame.SetSizer(frame_sizer)
Fragment 4 of 16
panel = wx.Panel(frame)
frame_sizer.Add(panel)
Fragment 5 of 16
sizer = wx.BoxSizer(orient=wx.HORIZONTAL)
panel.SetSizer(sizer)
Fragment 6 of 16
button = wx.Button(panel, label=text)
sizer.Add(button)
Fragment 7 of 16
sizer = wx.WrapSizer(orient = wx.HORIZONTAL) # default

sizer = wx.WrapSizer(orient = wx.VERTICAL)
Fragment 8 of 16
sizer = wx.BoxSizer(orient = wx.HORIZONTAL)

sizer = wx.BoxSizer(orient = wx.VERTICAL)
Fragment 9 of 16
sizer = wx.StaticBoxSizer(orient, parent, label)
Fragment 10 of 16
sizer = wx.GridSizer(cols=cols, vgap=v, hgap=h)
Fragment 11 of 16
sizer = wx.GridSizer(rows=rows, cols=cols,
                     vgap=v, hgap=h)
Fragment 12 of 16
sizer = wx.FlexGridSizer(cols=cols, vgap=v, hgap=h)
Fragment 13 of 16
sizer = wx.GridBagSizer(vgap=v, hgap=h)
Fragment 14 of 16
sizer.Add(widget, pos=wx.GBPosition(row=row,
                                    col=column))
Fragment 15 of 16
sizer.Add(widget, pos=wx.GBPosition(row=row,
                                    col=column),
                  span=wx.GBSpan(rowspan=rows,
                                 colspan=columns))
Fragment 16 of 16
wx.Size(width = 1, height = 1)

2.1.11 The Bind Method6 fragments

Fragment 1 of 6
button.Bind(wx.EVT_BUTTON, self.function)
Fragment 2 of 6
def button_function(self, event):
    # do something
Fragment 3 of 6
self.text = wx.StaticText(...)
Fragment 4 of 6
def handle_button(self, _event):
    self.clicks += 1
    self.text.SetLabel('Clicks so far: ' +
                       str(self.clicks))
Fragment 5 of 6
self.entry = wx.TextCtrl(parent)

button.Bind(wx.EVT_BUTTON, self.get_entry)
Fragment 6 of 6
def get_entry(self, event):
    text = self.entry.GetValue()

2.2.1 Creating a MenuBar6 fragments

Fragment 1 of 6
menubar = wx.MenuBar()
frame.SetMenuBar(menubar)
Fragment 2 of 6
file_menu = wx.Menu()
menubar.Append(file_menu, 'File')
Fragment 3 of 6
open_item = wx.MenuItem(file_menu, id=1, text='Open')
save_item = wx.MenuItem(file_menu, id=2, text='Save')

file_menu.Append(open_item)
file_menu.Append(save_item)
Fragment 4 of 6
open_item = file_menu.Append(1, 'Open')
save_item = file_menu.Append(2, 'Save')
Fragment 5 of 6
file_menu.Bind(wx.EVT_MENU, self.open_fcn, open_item)
file_menu.Bind(wx.EVT_MENU, self.save_fcn, save_item)
Fragment 6 of 6
def open_fcn(self, event):
    # Code to do something

def save_fcn(self, event):
    # Code to do something

2.2.2 Defining Accelerator Keys1 fragment

Fragment 1 of 1
open_item = file_menu.Append(1, '&Open\\tCtrl+O')

2.2.3 Standard IDs9 fragments

Fragment 1 of 9
button = wx.Button(parent, id, label)
Fragment 2 of 9
ok_button = wx.Button(panel, label='OK')
ok_button = wx.Button(panel, wx.ID_OK)
Fragment 3 of 9
open_item = file_menu.Append(1, '&Open\\tCtrl+O')
save_item = file_menu.Append(2, '&Save\\tCtrl+S')
Fragment 4 of 9
open_item = file_menu.Append(wx.ID_OPEN)
save_item = file_menu.Append(wx.ID_SAVE)
Fragment 5 of 9
open_button = wx.Button(panel, wx.ID_OPEN)
Fragment 6 of 9
file_menu.Bind(wx.EVT_MENU, self.save_fcn,
               save_item)
Fragment 7 of 9
MY_ID = wx.NewIdRef()

file_menu.Append(MY_ID, self.my_fcn, 'Crevulate')
self.Bind(wx.EVT_MENU, self.my_fcn, id=MY_ID)
Fragment 8 of 9
menu_item = file_menu.Append(wx.ID_ANY, 'Crevulate')
self.Bind(wx.EVT_MENU, self.my_fcn, menu_item)
Fragment 9 of 9
menu.AppendSeparator()

2.2.4 Adding Submenus5 fragments

Fragment 1 of 5
submenu = wx.Menu()
Fragment 2 of 5
item = submenu.Append(id, text)
Fragment 3 of 5
menu.AppendSubMenu(submenu, text, help)
Fragment 4 of 5
size_menu = wx.Menu()

size1 = size_menu.Append(wx.ID_ANY, "Small")
size2 = size_menu.Append(wx.ID_ANY, "Medium")
size3 = size_menu.Append(wx.ID_ANY, "Large")

edit_menu.AppendSubMenu(size_menu, "Font size")
Fragment 5 of 5
size_menu.Bind(wx.EVT_MENU, self.change_size)

def change_size(self, event):
    menubar = self.frame.GetMenuBar()
    item = menubar.FindItemById(event.GetId())
    label = item.GetItemLabelText()
    print(label)

2.2.5 Tooltips1 fragment

Fragment 1 of 1
tipString = wx.ToolTip(tip) # tip is an ordinary string
widget.SetToolTip(tipString)

2.2.6 The Status Bar1 fragment

Fragment 1 of 1
frame.CreateStatusBar()

menu_item = menu.Append(parentMenu, id, text,
                        helpString)

2.3.1 Understanding the Add Method3 fragments

Fragment 1 of 3
sizer.Add(widget/sizer)
Fragment 2 of 3
sizer.Add(widget/sizer, proportion, flag, border)
Fragment 3 of 3
gb_sizer.Add(widget/sizer, pos=wx.GBPosition(row, col))

gb_sizer.Add(widget/sizer, pos, span, flag, border)

2.3.1.2 Spacing Around Widgets3 fragments

Fragment 1 of 3
sizer.Add(widget/sizer, proportion, flag, border)
Fragment 2 of 3
sizer.Add(button, 0, wx.TOP | wx.LEFT, 12)
Fragment 3 of 3
panel = wx.Panel(frame)
panel_sizer = wx.BoxSizer(orient=wx.HORIZONTAL)
panel.SetSizer(panel_sizer)

button = wx.Button(panel, label="Push Me")
sizer_1 = wx.BoxSizer(orient=wx.HORIZONTAL)
sizer_2 = wx.BoxSizer(orient=wx.HORIZONTAL)

sizer_1.Add(button, 0, wx.LEFT | wx.RIGHT, 40)
sizer_2.Add(sizer_1, 0, wx.TOP | wx.BOTTOM, 20)
panel_sizer.Add(sizer_2)

2.3.1.3 Spacers4 fragments

Fragment 1 of 4
sizer.AddSpacer(size=pixels)
Fragment 2 of 4
def spacers(self, widget, left, right, top, bottom):

    hbox = wx.BoxSizer(wx.HORIZONTAL)
    hbox.AddSpacer(left)
    hbox.Add(widget)
    hbox.AddSpacer(right)

    vbox = wx.BoxSizer(wx.VERTICAL)
    vbox.AddSpacer(top)
    vbox.Add(hbox)
    vbox.AddSpacer(bottom)

    return vbox # Note that this returns a sizer
Fragment 3 of 4
panel = wx.Panel(frame)
button = wx.Button(panel3, label="Button")
sizer = self.add_spacers(button3, 10, 20, 30, 40)
panel3.SetSizer(sizer)
Fragment 4 of 4
sizer.AddStretchSpacer(prop)

2.3.1.4 Resizing Panels2 fragments

Fragment 1 of 2
sizer.Add(window, proportion, flag, border)
Fragment 2 of 2
sizer.AddGrowableRow(idx, proportion)

sizer.AddGrowableCol(idx, proportion)

2.3.1.6 Resizing Widgets1 fragment

Fragment 1 of 1
edit_area = wx.TextCtrl(panel, style=wx.TE_MULTILINE)

sizer = wx.BoxSizer(orient=wx.HORIZONTAL)
panel.SetSizer(sizer)
sizer.Add(edit_area, 1, wx.EXPAND)

2.3.2 Positioning Windows4 fragments

Fragment 1 of 4
window.CentreOnScreen(direction)
Fragment 2 of 4
screen = wx.Display(0)
Fragment 3 of 4
geometry = screen.GetGeometry()
(w, h) = (geometry.GetWidth(), geometry.GetHeight())
Fragment 4 of 4
rectangle = screen.GetClientArea()
(left, top, width, height) = rectangle

2.4.1 Dialog Wrappers6 fragments

Fragment 1 of 6
wx.GetTextFromUser(message, caption,
                         default_value='')
Fragment 2 of 6
wx.GetPasswordFromUser(message, caption,
                             default_value='')
Fragment 3 of 6
wx.GetNumberFromUser(message, prompt, caption, value, min=0, max=100)
Fragment 4 of 6
wx.GetFontFromUser(parent, fontInit, caption)
Fragment 5 of 6
wx.GetColourFromUser(parent, colInit, caption)
Fragment 6 of 6
def get_yes_or_no(self, message):
    query = message.strip()
    if query[-1] != '?':
        query += '?'
    dlg = wx.MessageDialog(parent=None,
                           message=query,
                           style=wx.YES_NO)
    return dlg.ShowModal() == wx.ID_YES

2.4.2 Predefined Dialogs2 fragments

Fragment 1 of 2
dlg = wx.SomePredefinedDialog(parent, other_arguments)
if dlg.ShowModal() == wx.ID_OK:
    # Use dialog results
dlg.Destroy()
Fragment 2 of 2
with wx.SomePredefinedDialog(parent,
                             other_arguments) as dlg:
    if dlg.ShowModal() == wx.ID_OK:
        # Use dialog results

2.4.2.1 MessageDialog2 fragments

Fragment 1 of 2
dlg = wx.MessageDialog(parent, message, caption, style)
Fragment 2 of 2
dlg = wx.MessageDialog(parent = frame,
                       message = 'This is the message',
                       caption = 'This is the caption')
result = dlg.ShowModal()

2.4.2.2 TextEntryDialog4 fragments

Fragment 1 of 4
dlg = wx.TextEntryDialog(parent, message, caption,
                         value, style)
Fragment 2 of 4
with wx.TextEntryDialog(parent = self.frame,
                        message = 'What is your name?',
                        caption = 'Caption',
                        value='Type here') as dlg:
    if dlg.ShowModal() == wx.ID_OK:
        print(dlg.GetValue())
    else:
        print('Dialog was cancelled.')
Fragment 3 of 4
style = wx.TE_MULTILINE | wx.OK | wx.CANCEL
Fragment 4 of 4
style = wx.TE_MULTILINE | wx.TextEntryDialogStyle

2.4.2.3 PasswordEntryDialog1 fragment

Fragment 1 of 1
dlg = wx.PasswordEntryDialog(parent, message,
                             caption, defaultValue)

2.4.2.4 NumberEntryDialog1 fragment

Fragment 1 of 1
dlg = wx.NumberEntryDialog(parent, message, prompt,
                           caption, value, min, max)

if dlg.ShowModal() == wx.ID_OK:
    number = dlg.GetValue()

2.4.2.5 FileDialog2 fragments

Fragment 1 of 2
dlg = wx.FileDialog(parent, message)
Fragment 2 of 2
wx.FileDialog(parent, message, style=wx.FD_MULTIPLE)

2.4.2.6 File I/O2 fragments

Fragment 1 of 2
dialog = wx.FileDialog(self.frame, "Open Text File",
                       style=wx.FD_OPEN)
if dialog.ShowModal() == wx.ID_OK:
    pathname = dialog.GetPath()
    # Your code to read the file goes here
dialog.Destroy()
Fragment 2 of 2
dialog = wx.FileDialog(None, "Save Text File",
                       style=wx.FD_SAVE)
if dialog.ShowModal() == wx.ID_OK:
    pathname = dialog.GetPath()
    # Your code to save the file goes here
dialog.Destroy()

2.4.2.7 DirDialog2 fragments

Fragment 1 of 2
with wx.DirDialog(frame,
                  message='Choose a directory') as dlg:
    if dlg.ShowModal() == wx.ID_OK:
        path = dlg.GetPath()
Fragment 2 of 2
with wx.DirDialog(frame,
                  message='Choose directories:',
                  style=wx.DD_MULTIPLE) as dlg:
    if dlg.ShowModal() == wx.ID_OK:
        paths = dlg.GetPaths()

2.4.2.8 FindReplaceDialog2 fragments

Fragment 1 of 2
data = wx.FindReplaceData()
data.SetFindString('abc')
data.SetFlags(wx.FR_WHOLEWORD)

self.dlg = wx.FindReplaceDialog(parent, data=data,
                             style=wx.FR_REPLACEDIALOG)
self.dlg.Show()
Fragment 2 of 2
self.frame.Bind(wx.EVT_FIND_CLOSE, self.on_find_close)

def on_find_close(self, event):
    self.dlg.Destroy()

2.4.2.9 SingleChoiceDialog1 fragment

Fragment 1 of 1
dlg = wx.SingleChoiceDialog(parent, message,
                            caption, choices)

2.4.2.10 MultiChoiceDialog1 fragment

Fragment 1 of 1
dlg = wx.MultiChoiceDialog(parent, message,
                           caption, choices)

2.4.2.11 FontDialog3 fragments

Fragment 1 of 3
dlg = FontDialog(parent)
Fragment 2 of 3
dlg = FontDialog(parent, data)
Fragment 3 of 3
with wx.FontDialog(parent) as dlg:
    if dlg.ShowModal() == wx.ID_OK:
        font = dlg.GetFontData().GetChosenFont()

2.4.2.12 SymbolPickerDialog2 fragments

Fragment 1 of 2
wx.richtext.SymbolPickerDialog(symbol, initialFont, normalTextFont, parent)
Fragment 2 of 2
from wx.richtext import SymbolPickerDialog

with SymbolPickerDialog('', '', '', self.frame) as dlg:
    if dlg.ShowModal() == wx.ID_OK:
        print(dlg.GetFontName(), dlg.GetSymbol())

2.4.2.13 ColourDialog1 fragment

Fragment 1 of 1
data = wx.ColourData()
with wx.ColourDialog(parent, data) as dlg:
    if dlg.ShowModal() == wx.ID_OK:
        print(dlg.GetColourData().GetColour())

2.4.2.14 PyColourChooser1 fragment

Fragment 1 of 1
import wx.lib.colourchooser.pycolourchooser as pycc

def open_dialog(self, _evt):
    dlg = wx.Frame(self.frame)
    panel = pycc.PyColourChooser(dlg, id=-1)
    panel.Bind(pycc.EVT_COLOUR_CHANGED,
               self.on_colour_changed)
    dlg.Fit()
    dlg.Show()

def on_colour_changed(self, event):
    colour = event.GetColour()
    print(colour)

2.4.2.15 Styles1 fragment

Fragment 1 of 1
dlg = wx.MessageDialog(parent=self.frame,
                       message='Do you love me?',
                       caption='Valentine',
                       style = wx.YES_NO)

result = dlg.ShowModal()
answers = {wx.ID_YES: 'Yes', wx.ID_NO: 'No'}
print(answers[result])

2.4.3 Custom Dialogs2 fragments

Fragment 1 of 2
class MyCustomDialog(wx.Dialog):
    def __init__(self, parent):
        super().__init__(parent, title="title")
        # Add widgets to self
Fragment 2 of 2
def set_font_size(self, new_size):
    font = self.text_ctrl.GetFont()
    font.SetFractionalPointSize(new_size)
    self.text_ctrl.SetFont(font)

2.4.3.1 Modal Dialogs3 fragments

Fragment 1 of 3
dlg = MyModalDialog(parent)
if dlg.ShowModal() == wx.ID_OK:
    print(dlg.result)
dlg.Destroy()
Fragment 2 of 3
font = self.text_ctrl.GetFont()
font_size = font.GetFractionalPointSize()
Fragment 3 of 3
dlg = FontSizeDialog(self.text_ctrl, font_size)
if dlg.ShowModal() == wx.ID_OK:
    self.set_font_size(dlg.result)
dlg.Destroy()

class FontSizeDialog(wx.Dialog):
    def __init__(self, parent, current_size):
        super().__init__(parent, title='Font Size')
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer)

        label = wx.StaticText(self,
                              label='Font size:')
        sizer.Add(label, flag=wx.ALL, border=5)
        
        self.slider = wx.Slider(
            self, value=int(current_size),
            minValue=8, maxValue=96,
            style=wx.SL_LABELS)
        sizer.Add(self.slider, flag=wx.ALL, border=5)

        ok_button = wx.Button(self, id=wx.ID_OK)
        sizer.Add(ok_button, flag=wx.ALL, border=5)
        ok_button.Bind(wx.EVT_BUTTON, self.ok)

        sizer.Fit(self)

    def ok(self, event):
        self.result = self.slider.GetValue()
        self.EndModal(wx.ID_OK)

2.4.3.2 Non-Modal Dialogs10 fragments

Fragment 1 of 10
import wx.lib.newevent

FontSizeChangedEvent, EVT_FONT_SIZE_CHANGED = (
            wx.lib.newevent.NewCommandEvent() )
Fragment 2 of 10
self.dlg = None
Fragment 3 of 10
button = wx.Button(panel, label='Set Font Size')
sizer.Add(button, flag=wx.ALL, border=5)
button.Bind(wx.EVT_BUTTON, self.nonmodal_font_size)
Fragment 4 of 10
self.slider.Bind(wx.EVT_SLIDER, self.slider_changed)
self.Bind(wx.EVT_CLOSE, self.on_close)
Fragment 5 of 10
def slider_changed(self, event):
    value = self.slider.GetValue()
    evt = FontSizeChangedEvent(self.GetId(),
                               value=value)
    wx.PostEvent(self, evt)
Fragment 6 of 10
def on_close(self, event):
    self.Destroy()
Fragment 7 of 10
def nonmodal_font_size(self, event):
    font = self.text_ctrl.GetFont()
    size = font.GetFractionalPointSize()

    if self.dlg is None:
        self.dlg = FontSizeNonModalDialog(self, size)
        
        self.dlg.Bind(EVT_FONT_SIZE_CHANGED,
                      self.on_font_change_event)
        self.dlg.Bind(wx.EVT_WINDOW_DESTROY,
                      self.on_dlg_destroyed)
        
        self.dlg.Show()
    else:
        self.dlg.Raise()
Fragment 8 of 10
font = self.text_ctrl.GetFont()
font_size = font.GetFractionalPointSize()
Fragment 9 of 10
def on_font_change_event(self, event):
    new_size = event.value
    self.set_font_size(new_size)
Fragment 10 of 10
def on_dlg_destroyed(self, event):
    self.dlg = None
    event.Skip()

2.5 The Transformer Program2 fragments

Fragment 1 of 2
import wx, transformer_logic

class TransformerClass(wx.Frame):
    def __init__(self):
        super().__init__(None,
                         title='Identity Transformer',
                         size=(500, 600))

        transformers = list(
            transformer_logic.transformers.keys())

        # Create a frame and one panel
        panel = wx.Panel(self)
        control_panel = wx.Panel(panel)

        # Define widgets as instance variables

        self.input_area = wx.TextCtrl(
                panel, style = wx.TE_MULTILINE)

        self.output_area = wx.TextCtrl(
            panel, style = wx.TE_MULTILINE)
        
        transform_button = wx.Button(
            control_panel, label = 'Transform')

        self.chooser = wx.ComboBox(
            control_panel, choices = transformers)

        self.create_menus()
            
        # Use a sizer to arrange widgets in a panel

        sizer = wx.BoxSizer(orient = wx.VERTICAL)
        panel.SetSizer(sizer)

        sizer.Add(self.input_area, 1, wx.EXPAND)
        sizer.Add(self.output_area,with wx.FileDialog(None, "Save Text File" 1, wx.EXPAND)
        sizer.Add(control_panel)

        control_sizer = wx.BoxSizer(wx.HORIZONTAL)
        control_panel.SetSizer(control_sizer)
        
        control_sizer.Add(10, 0, 0)
        control_sizer.Add(self.chooser)
        control_sizer.Add(50, 0, 0)
        control_sizer.Add(transform_button)
        
        # Bind an action to the active widget
        
        transform_button.Bind(
            wx.EVT_BUTTON, self.transform)


    def create_menus(self):
        menubar = wx.MenuBar()
        self.SetMenuBar(menubar)

        file_menu = wx.Menu()
        menubar.Append(file_menu, "&File")

        open_item = file_menu.Append(wx.ID_OPEN,
                         "&Open original\\tCtrl+O")
        save_item = file_menu.Append(wx.ID_SAVE,
                         "&Save transformed\\tCtrl+S")

        self.Bind(wx.EVT_MENU, self.open_original,
                  open_item)
        self.Bind(wx.EVT_MENU, self.save_transformed,
                  save_item)


    def transform(self, _event):
        transformer = self.chooser.GetValue()
        lines = self.input_area.GetValue().splitlines()
        result = transformer_logic.transform(
            transformer, lines)

        if isinstance(result, list):
            self.output_area.SetValue(
                '\\n'.join(result))
        else:
            self.output_area.SetValue(
                self.chooser.GetValue() +
                ' function returned: ' +
                str(result))

        # Update window title
        self.SetTitle(f'{transformer} Transformer')

    def open_original(self, _event):
        style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST

        with wx.FileDialog(self, "Open Text File",
            style = style) as dialog:
            if dialog.ShowModal() == wx.ID_OK:
                pathname = dialog.GetPath()
                try:
                    with open(pathname, 'r') as file:
                        content = file.read()
                    self.input_area.SetValue(content)
                except Exception:
                    msg = 'Not a valid text file.'
                    wx.MessageDialog(self,
                                     msg).ShowModal()
   
    def save_transformed(self, _event):
        with wx.FileDialog(None, "Save Text File",
                           style=wx.FD_SAVE) as dialog:
            if dialog.ShowModal() == wx.ID_OK:
                pathname = dialog.GetPath()
                with open(pathname, 'w') as file:
                    content=self.output_area.GetValue()
                    file.write(content)

# Run the program
if __name__ == '__main__':
    app = wx.App()
    frame = TransformerClass()
    frame.Show()
    app.MainLoop()
Fragment 2 of 2
def identity(lines):
    return lines

def reverse_lines(lines): # <- (translator, lines)
    reversed_lines = lines[:]
    for i in range(0, len(lines)):
        reversed_lines[i] = lines[i][::-1]
    return reversed_lines

def shuffle(lines):
    import random
    copy = lines[:]
    random.shuffle(copy)
    return copy

# There are two steps to adding a transformer:
# (1) Add a function above. It should take a list
#     of lines and return a list of lines.
# (2) Add display name and function name to the
#     following dictionary.
transformers = {
    'Identity': identity,
    'Reverse lines': reverse_lines,
    'Shuffle' : shuffle
    }

def transform(choice, lines):
    return transformers[choice](lines)

3.2 Controlling Propagation2 fragments

Fragment 1 of 2
button.Bind(wx.EVT_BUTTON,self.print_button)

def print_button(self, event):
    print("The special button was clicked.")
Fragment 2 of 2
def print_button(self, event):
    print("The special button was clicked.")
    event.Skip()

3.2.1 Intercepting System Events2 fragments

Fragment 1 of 2
self.text_ctrl.Bind(wx.EVT_CHAR, self.handle_char)

def handle_char(self, event):
    kc = event.GetKeyCode()
    if ord('0') <= kc <= ord('9'):
        event.Skip()
Fragment 2 of 2
self.text_ctrl.Bind(wx.EVT_TEXT_ENTER, self.do_enter)

def do_enter(self, event):
    value = self.text_ctrl.GetValue()
    if self.text_ctrl.GetValue().isdigit():
        print(f'Do something with {value}.')
    else:
        wx.Bell()
    event.Skip()

3.3 Disabling Widgets2 fragments

Fragment 1 of 2
widget.Disable()

widget.Enable()
Fragment 2 of 2
panel.Layout()
frame.Layout()
frame.Fit()

3.4 Three Skeletons4 fragments

Fragment 1 of 4
import wx

class GuiFrame(wx.Frame):

    def __init__(self):
        super().__init__(None, title='GuiFrame')
        # Populate this Frame as 'self'
        self.Show()

if __name__ == '__main__':
    app = wx.App()
    GuiFrame()
    app.MainLoop()
Fragment 2 of 4
import wx

class GuiApp(wx.App):

    def __init__(self):
        super().__init__()
        # Do any needed initializations...

    def OnInit(self):
        frame = wx.Frame(None, title='GuiApp')
        # Populate the frame
        frame.Show()
        return True

if __name__ == '__main__':
    app = GuiApp()
    app.MainLoop()
Fragment 3 of 4
import wx

class GuiClass:
    
    def __init__(self):
        frame = wx.Frame(None, title='Gui Class')
        # Populate the frame
        frame.Show()

if __name__ == '__main__':
    app = wx.App()
    GuiClass()
    app.MainLoop()
Fragment 4 of 4
class Gui(wx.Frame):
    def __init__(self):
        super().__init__(None, title='Gui')
        # Gui code

class MainApplication(wx.App):
    def OnInit(self):
        self.gui = Gui()
        self.gui.Show()
        return True
    # Application code

if __name__ == '__main__':
    app = MainApplication()
    app.MainLoop()

3.5 Books and Pages3 fragments

Fragment 1 of 3
book = wx.Listbook(parent) # or some other type

page = wx.Panel(book) # or some other window
book.AddPage(page, text='page name')
Fragment 2 of 3
book.InsertSubPage(pagePos, page, text)
Fragment 3 of 3
book.AddSubPage(page, text)

3.5.1 Adding Icons to Pages3 fragments

Fragment 1 of 3
bmp = wx.ArtProvider.GetBitmap(icon, wx.ART_TOOLBAR,
                               size=(16, 16))
Fragment 2 of 3
book.SetImages(list_of_bitmaps)
Fragment 3 of 3
book.AddPage(page, text='page name', imageId=index)

3.6 Binding Multiple Buttons3 fragments

Fragment 1 of 3
for i in range(0, 10):
    button = wx.Button(panel, label=f'{i}')
    sizer.Add(button, border=5)
    button.Bind(wx.EVT_BUTTON, self.handle_event)
Fragment 2 of 3
panel.Bind(wx.EVT_BUTTON, self.handle_event)
Fragment 3 of 3
def handle_event(self, event):
    obj = event.GetEventObject()
    print('Button label =', obj.GetLabel())

3.7 Lambda Bindings2 fragments

Fragment 1 of 2
labels = ['+', '-', '*', '/']

for i in range(0, 4):
    button = wx.Button(panel, label=labels[i])
    button.Bind(wx.EVT_BUTTON,
                lambda event, arg_1=i, arg_2=labels[i]:
                    self.do_btn(event, arg_1, arg_2))
Fragment 2 of 2
def do_btn(self, event, arg_1, arg_2):
    print(f'{arg_1=}, {arg_2=}')

3.8 Fonts7 fragments

Fragment 1 of 7
info = wx.FontInfo(24).FaceName("Helvetica").Bold()
font = wx.Font(info)
Fragment 2 of 7
my_text = wx.StaticText(panel, label='Pay attention!')
my_text.SetFont(font)
Fragment 3 of 7
font = widget.GetFont()
Fragment 4 of 7
font.SetFaceName('Inconsolata')
font.SetPointSize(24)
font.SetWeight(wx.FONTWEIGHT_BOLD)
font.SetStyle(wx.FONTSTYLE_ITALIC)
Fragment 5 of 7
font = widget.GetFont()
font.SetWeight(wx.FONTWEIGHT_BOLD)
widget.SetFont(font)
Fragment 6 of 7
font.SetFamily(wx.FONTFAMILY_TELETYPE)
font.SetFaceName("Inconsolata")
Fragment 7 of 7
desired_font = "BoogieWoogie"

enumerator = wx.FontEnumerator()
enumerator.EnumerateFacenames()
fonts = enumerator.GetFacenames()
if desired_font in fonts:
    font.SetFaceName(desired_font)

3.9 Adding Color1 fragment

Fragment 1 of 1
widget.SetBackgroundColour(colour)
widget.SetForegroundColour(colour)

3.10.1 Fancier Menus5 fragments

Fragment 1 of 5
file_menu.AppendSeparator()
Fragment 2 of 5
BOLD = 101
ITALIC = 102

edit_menu.Append(wx.ID_ANY, "Bold", kind=wx.ITEM_CHECK)
check2 = wx.MenuItem(edit_menu, ITALIC, text="Italic",
                     kind=wx.ITEM_CHECK)
edit_menu.Append(check1)
edit_menu.Append(check2)
Fragment 3 of 5
HIGH = 1000
MEDIUM = 999
LOW = 800

high = wx.MenuItem(security_menu, HIGH, "High",
                   kind=wx.ITEM_RADIO)
medium = wx.MenuItem(security_menu, MEDIUM, "Medium",
                   kind=wx.ITEM_RADIO)
low = wx.MenuItem(security_menu, LOW, "Low",
                   kind=wx.ITEM_RADIO)
security_menu.Append(high)
security_menu.Append(medium)
security_menu.Append(low)
Fragment 4 of 5
menu_item.SetBitmap(bitmap)
Fragment 5 of 5
img = wx.Image(path_to_file, wx.BITMAP_TYPE_PNG)
bmp = img.ConvertToBitmap()

3.10.2 wx.ArtProvider1 fragment

Fragment 1 of 1
bitmap = wx.ArtProvider.GetBitmap(
             id,
             client=wx.ART_OTHER,
             size=wx.DefaultSize)

3.10.4 TextCtrl6 fragments

Fragment 1 of 6
text_ctrl = wx.TextCtrl(panel)
Fragment 2 of 6
text_ctrl.SetHint(hint)
Fragment 3 of 6
text = text_ctrl.GetValue()
Fragment 4 of 6
text_ctrl = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
Fragment 5 of 6
text_ctrl = wx.TextCtrl(parent, style=style)
Fragment 6 of 6
text_ctrl.SetFont(font)
text_ctrl.Refresh() # not usually necessary

3.10.4.1 Editing in a wx.TextCtrl10 fragments

Fragment 1 of 10
location = text_ctrl.GetValue().find(string, start)
Fragment 2 of 10
text_ctrl.SetSelection(start, end)
Fragment 3 of 10
text_ctrl.Remove(start, end)
text_ctrl.WriteText(replacement)
text_ctrl.SetInsertionPoint(start + len(replacement))
Fragment 4 of 10
text = text_ctrl.GetValue()
text_ctrl.SetValue(text)

text_ctrl.GetRange(start, end)
Fragment 5 of 10
pos = text_ctrl.GetInsertionPoint()
text_ctrl.SetInsertionPoint(pos)

text_ctrl.SetInsertionPointEnd()
Fragment 6 of 10
text = text_ctrl.GetValue()
pos = text.find(target, start) # -1 if not found
Fragment 7 of 10
start, end.SetSelection(start, end)
Fragment 8 of 10
text_ctrl.WriteText(text)

text_ctrl.AppendText(text)
Fragment 9 of 10
text_ctrl.Remove(start, end)

text_ctrl.Replace(start, end, replacement)
Fragment 10 of 10
text = text_ctrl.GetValue()
search_from = text_ctrl.GetInsertionPoint()

start = text.find(target, search_from)
end = start + len(target)
text_ctrl.Replace(start, end, replacement)

search_from = end

3.10.4.2 Rich Text8 fragments

Fragment 1 of 8
(start, end) = text_ctrl.GetSelection()
Fragment 2 of 8
attr = wx.TextAttr()
Fragment 3 of 8
text_ctrl.GetStyle(start, attr)
Fragment 4 of 8
font = attr.GetFont()
Fragment 5 of 8
font.SetFaceName('Impact')
font.MakeBold()
font.MakeItalic()
font.SetPointSize(24)
Fragment 6 of 8
attr.SetFont(font)
Fragment 7 of 8
text_ctrl.SetStyle(start, end, attr)
Fragment 8 of 8
attr = wx.TextAttr()
attr.SetTextColour(wx.RED)
attr.SetBackgroundColour(wx.Colour(255, 255, 0))
text_ctrl.SetStyle(start, end, attr)

3.10.5 Radio Buttons6 fragments

Fragment 1 of 6
radio_button.SetValue(True)
Fragment 2 of 6
levels = ['Low', 'Medium', 'High']
self.radio_box = wx.RadioBox(panel5,
                             label='Security Level',
                             choices=levels,
                             style=wx.RA_SPECIFY_ROWS)
sizer5.Add(self.radio_box, flag=wx.ALL, border=5)
Fragment 3 of 6
boolean = radio_button.GetValue()
Fragment 4 of 6
radio_button = self.radio_box.GetStringSelection()
Fragment 5 of 6
self.radio_button.Bind(wx.EVT_RADIOBUTTON, self.do_btn)
Fragment 6 of 6
self.radio_box.Bind(wx.EVT_RADIOBOX, self.do_box)

3.10.6 Sliders2 fragments

Fragment 1 of 2
self.slider = wx.Slider(panel,
                        id = wx.ID_ANY, value = 50,
                        minValue = 0, maxValue = 100,
                        size = wx.Size(width, height),
                        style = wx.SL_HORIZONTAL)
Fragment 2 of 2
self.slider.Bind(wx.EVT_SLIDER, handler)

3.10.7 Gauges1 fragment

Fragment 1 of 1
gauge = wx.Gauge(panel, id = wx.ID_ANY, range = 100,
                 size = wx.Size(width, height),
                 style = wx.GA_HORIZONTAL)

3.10.8 Spin Controls1 fragment

Fragment 1 of 1
spin = wx.SpinCtrl(panel, id = wx.ID_ANY,
                   min = 0, max = 100, initial = value)

spin.Bind(wx.EVT_SPINCTRL, handler)

3.10.9 Tree Controls5 fragments

Fragment 1 of 5
self.tree = wx.TreeCtrl(panel)
root = self.tree.AddRoot("Name of root")
Fragment 2 of 5
item = self.tree.AppendItem(root, 'Item name')
Fragment 3 of 5
subitem = self.tree.AppendItem(item, 'Subitem name')
Fragment 4 of 5
self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, handler)
Fragment 5 of 5
select = self.tree.GetSelection()
text = self.tree.GetItemText(select)

3.10.10 ListViews6 fragments

Fragment 1 of 6
view = wx.ListView(parent)
Fragment 2 of 6
view.AppendColumn(col, heading, width=width)
Fragment 3 of 6
view.Append(entry)
Fragment 4 of 6
view.Bind(wx.EVT_LIST_ITEM_SELECTED, handler)
Fragment 5 of 6
def function(self, event):
     print(event.GetIndex(), event.GetText())
Fragment 6 of 6
self.view = wx.ListView(panel)

self.view.AppendColumn("Planet", width=150)
self.view.AppendColumn("Mass", width=80)
self.view.AppendColumn("Distance (AU)",
                       width=120)

self.view.Append(["Venus", "0.815", "0.72"])
self.view.Append(["Earth", "1.00", "1.00"])
self.view.Append(["Mars", "0.1075", "1.52"])

3.10.11 Grids3 fragments

Fragment 1 of 3
import wx.grid

grid = wx.grid.Grid(parent)
grid.CreateGrid(numRows, numCols)
Fragment 2 of 3
sizer.Add(self.grid, 1, wx.EXPAND | wx.ALL, 5)
Fragment 3 of 3
grid.Bind(wx.grid.EVT_GRID_CELL_CHANGED, handler)

3.10.12 Splitter Windows2 fragments

Fragment 1 of 2
splitter = wx.SplitterWindow(parent)

left = wx.Panel(splitter)
right = wx.Panel(splitter)

splitter.SplitVertically(left, right)
splitter.SetSashGravity(0.5)
Fragment 2 of 2
parent_sizer.Add(splitter, 1, wx.EXPAND | wx.ALL)