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)