def CreateUI(self, parent, sizer): fold_panel = self.CreateFoldPanel(sizer) pnl = wx.Panel(fold_panel) pnl.SetBackgroundColour(wx.Colour("#464646")) vbox = wx.BoxSizer(wx.VERTICAL) hbox = wx.BoxSizer(wx.HORIZONTAL) self.textcontrol = TextCtrl(pnl, value=self.GetValue(), style=wx.BORDER_SIMPLE, placeholder="", size=(-1, 32)) hbox.Add(self.textcontrol, proportion=1, flag=wx.EXPAND | wx.BOTH) self.button = Button(pnl, label=self.GetBtnLabel(), size=(-1, 32)) hbox.Add(self.button, flag=wx.LEFT, border=5) self.button.Bind(EVT_BUTTON, self.WidgetEvent) vbox.Add(hbox, flag=wx.EXPAND | wx.BOTH | wx.ALL, border=6) vbox.Fit(pnl) pnl.SetSizer(vbox) self.AddToFoldPanel(sizer, fold_panel, pnl, spacing=10)
def BuildUI(self): main_sizer = wx.BoxSizer(wx.VERTICAL) topbar = wx.Panel(self) topbar.SetBackgroundColour("#424242") topbar_sizer = wx.GridBagSizer(vgap=1, hgap=1) self.area_icon = wx.StaticBitmap(topbar, bitmap=ICON_NODEGRAPH_PANEL.GetBitmap()) self.area_label = wx.StaticText(topbar, label="") self.area_label.SetForegroundColour("#fff") self.area_label.SetFont(self.area_label.GetFont().Bold()) self.zoom_field = NumberField(topbar, default_value=100, label=_("Zoom"), min_value=25, max_value=250, suffix="%", show_p=False) self.menu_button = Button(topbar, label="", flat=True, bmp=(ICON_MORE_MENU_SMALL.GetBitmap(), 'left')) topbar_sizer.Add(self.area_icon, (0, 0), flag=wx.LEFT | wx.TOP | wx.BOTTOM, border=8) topbar_sizer.Add(self.area_label, (0, 1), flag=wx.ALL, border=8) topbar_sizer.Add(self.zoom_field, (0, 3), flag=wx.ALL, border=3) topbar_sizer.Add(self.menu_button, (0, 4), flag=wx.ALL, border=3) topbar_sizer.AddGrowableCol(2) topbar.SetSizer(topbar_sizer) self.nodegraph = NodeGraph(self, self.registry, size=(-1, self.Size[0]-20)) # here for testing self.nodegraph.AddNode('image_node', wx.Point(100, 10)) self.nodegraph.AddNode('image_node', wx.Point(400, 100)) self.nodegraph.AddNode('blur_node', wx.Point(600, 200)) self.nodegraph.AddNode('mix_node', wx.Point(100, 200)) self.nodegraph.AddNode('output_node', wx.Point(300, 270)) self.nodegraph.AddNode('flip_node', wx.Point(400, 270)) main_sizer.Add(topbar, flag=wx.EXPAND | wx.LEFT | wx.RIGHT) main_sizer.Add(self.nodegraph, 1, flag=wx.EXPAND | wx.BOTH) self.SetSizer(main_sizer) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODESELECT, self.UpdateNodePropertiesPnl) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODECONNECT, self.NodeConnectEvent) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODEDISCONNECT, self.NodeDisconnectEvent) self.nodegraph.Bind(EVT_GSNODEGRAPH_MOUSEZOOM, self.ZoomNodeGraph) self.zoom_field.Bind(EVT_NUMBERFIELD_CHANGE, self.ChangeZoom) self.menu_button.Bind(EVT_BUTTON, self.OnAreaMenuButton) self.Bind(wx.EVT_MENU, self.OnMenuUndockPanel, id=ID_MENU_UNDOCKPANEL) self.Bind(wx.EVT_MENU, self.OnMenuHidePanel, id=ID_MENU_HIDEPANEL) self.nodegraph.Bind(wx.EVT_ENTER_WINDOW, self.OnAreaFocus)
def UpdatePanelContents(self, selected_node): self.main_panel.DestroyChildren() if selected_node is not None: # Node info nodeinfo_pnl = wx.Panel(self.main_panel, size=(-1, 50)) nodeinfo_pnl.SetBackgroundColour("#464646") nodeinfo_pnl_sizer = wx.GridBagSizer(vgap=1, hgap=1) node_label = wx.StaticText(nodeinfo_pnl, label=selected_node._label) node_label.SetForegroundColour("#fff") node_label.SetFont(self.area_label.GetFont().Bold()) self.help_button = Button(nodeinfo_pnl, label="", flat=True, bmp=(ICON_HELP.GetBitmap(), 'left')) nodeinfo_pnl_sizer.Add(node_label, (0, 1), flag=wx.TOP | wx.BOTTOM, border=6) nodeinfo_pnl_sizer.Add(self.help_button, (0, 4), flag=wx.TOP | wx.BOTTOM | wx.RIGHT, border=6) nodeinfo_pnl_sizer.AddGrowableCol(2) nodeinfo_pnl.SetSizer(nodeinfo_pnl_sizer) self._mainsizer.Add(nodeinfo_pnl, flag=wx.EXPAND) # Node Properties panel_bar = fpb.FoldPanelBar(self.main_panel, agwStyle=fpb.FPB_VERTICAL) selected_node.NodePanelUI(self.main_panel, panel_bar) style = fpb.CaptionBarStyle() style.SetCaptionFont(self.Parent.GetFont()) style.SetCaptionColour(wx.Colour("#fff")) style.SetFirstColour(wx.Colour('#5c5c5c')) style.SetSecondColour(wx.Colour('#5c5c5c')) panel_bar.ApplyCaptionStyleAll(style) self._mainsizer.Add(panel_bar, 1, wx.EXPAND | wx.ALL) self._mainsizer.Layout() # Also bind the focus handler to the main panel and panel_bar nodeinfo_pnl.Bind(wx.EVT_ENTER_WINDOW, self.OnAreaFocus) panel_bar.Bind(wx.EVT_ENTER_WINDOW, self.OnAreaFocus) else: # Delete the window if the node is not selected self._mainsizer.Clear(delete_windows=True) self.AUIManager.Update() self.Parent.Refresh() self.Parent.Update()
def BuildUI(self): main_sizer = wx.BoxSizer(wx.VERTICAL) topbar = wx.Panel(self) topbar.SetBackgroundColour("#424242") topbar_sizer = wx.GridBagSizer(vgap=1, hgap=1) self.area_icon = wx.StaticBitmap(topbar, bitmap=ICON_NODEPROPERTIES_PANEL.GetBitmap()) self.area_label = wx.StaticText(topbar, label="") self.area_label.SetForegroundColour("#fff") self.area_label.SetFont(self.area_label.GetFont().Bold()) self.menu_button = Button(topbar, label="", flat=True, bmp=(ICON_MORE_MENU_SMALL.GetBitmap(), 'left')) topbar_sizer.Add(self.area_icon, (0, 0), flag=wx.LEFT | wx.TOP | wx.BOTTOM, border=8) topbar_sizer.Add(self.area_label, (0, 1), flag=wx.ALL, border=8) topbar_sizer.Add(self.menu_button, (0, 4), flag=wx.ALL, border=3) topbar_sizer.AddGrowableCol(2) topbar.SetSizer(topbar_sizer) self.main_panel = wx.Panel(self) self._mainsizer = wx.BoxSizer(wx.VERTICAL) self.main_panel.SetSizer(self._mainsizer) self._mainsizer.Fit(self.main_panel) main_sizer.Add(topbar, flag=wx.EXPAND | wx.LEFT | wx.RIGHT) main_sizer.Add(self.main_panel, 1, flag=wx.EXPAND | wx.BOTH) self.SetSizer(main_sizer) self.menu_button.Bind(EVT_BUTTON, self.OnAreaMenuButton) self.Bind(wx.EVT_MENU, self.OnMenuUndockPanel, id=ID_MENU_UNDOCKPANEL) self.Bind(wx.EVT_MENU, self.OnMenuHidePanel, id=ID_MENU_HIDEPANEL) self.main_panel.Bind(wx.EVT_ENTER_WINDOW, self.OnAreaFocus)
class NodePropertiesPanel(wx.Panel): def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.NO_BORDER | wx.TAB_TRAVERSAL): wx.Panel.__init__(self, parent, id, pos, size, style) self.parent = parent self.SetBackgroundColour(wx.Colour("#464646")) self.BuildUI() @property def Parent(self): return self.parent @property def AUIManager(self): return self.parent._mgr @property def Statusbar(self): return self.parent.statusbar def BuildUI(self): main_sizer = wx.BoxSizer(wx.VERTICAL) topbar = wx.Panel(self) topbar.SetBackgroundColour("#424242") topbar_sizer = wx.GridBagSizer(vgap=1, hgap=1) self.area_icon = wx.StaticBitmap(topbar, bitmap=ICON_NODEPROPERTIES_PANEL.GetBitmap()) self.area_label = wx.StaticText(topbar, label="") self.area_label.SetForegroundColour("#fff") self.area_label.SetFont(self.area_label.GetFont().Bold()) self.menu_button = Button(topbar, label="", flat=True, bmp=(ICON_MORE_MENU_SMALL.GetBitmap(), 'left')) topbar_sizer.Add(self.area_icon, (0, 0), flag=wx.LEFT | wx.TOP | wx.BOTTOM, border=8) topbar_sizer.Add(self.area_label, (0, 1), flag=wx.ALL, border=8) topbar_sizer.Add(self.menu_button, (0, 4), flag=wx.ALL, border=3) topbar_sizer.AddGrowableCol(2) topbar.SetSizer(topbar_sizer) self.main_panel = wx.Panel(self) self._mainsizer = wx.BoxSizer(wx.VERTICAL) self.main_panel.SetSizer(self._mainsizer) self._mainsizer.Fit(self.main_panel) main_sizer.Add(topbar, flag=wx.EXPAND | wx.LEFT | wx.RIGHT) main_sizer.Add(self.main_panel, 1, flag=wx.EXPAND | wx.BOTH) self.SetSizer(main_sizer) self.menu_button.Bind(EVT_BUTTON, self.OnAreaMenuButton) self.Bind(wx.EVT_MENU, self.OnMenuUndockPanel, id=ID_MENU_UNDOCKPANEL) self.Bind(wx.EVT_MENU, self.OnMenuHidePanel, id=ID_MENU_HIDEPANEL) self.main_panel.Bind(wx.EVT_ENTER_WINDOW, self.OnAreaFocus) def UpdatePanelContents(self, selected_node): self.main_panel.DestroyChildren() if selected_node is not None: # Node info nodeinfo_pnl = wx.Panel(self.main_panel, size=(-1, 50)) nodeinfo_pnl.SetBackgroundColour("#464646") nodeinfo_pnl_sizer = wx.GridBagSizer(vgap=1, hgap=1) node_label = wx.StaticText(nodeinfo_pnl, label=selected_node._label) node_label.SetForegroundColour("#fff") node_label.SetFont(self.area_label.GetFont().Bold()) self.help_button = Button(nodeinfo_pnl, label="", flat=True, bmp=(ICON_HELP.GetBitmap(), 'left')) nodeinfo_pnl_sizer.Add(node_label, (0, 1), flag=wx.TOP | wx.BOTTOM, border=6) nodeinfo_pnl_sizer.Add(self.help_button, (0, 4), flag=wx.TOP | wx.BOTTOM | wx.RIGHT, border=6) nodeinfo_pnl_sizer.AddGrowableCol(2) nodeinfo_pnl.SetSizer(nodeinfo_pnl_sizer) self._mainsizer.Add(nodeinfo_pnl, flag=wx.EXPAND) # Node Properties panel_bar = fpb.FoldPanelBar(self.main_panel, agwStyle=fpb.FPB_VERTICAL) selected_node.NodePanelUI(self.main_panel, panel_bar) style = fpb.CaptionBarStyle() style.SetCaptionFont(self.Parent.GetFont()) style.SetCaptionColour(wx.Colour("#fff")) style.SetFirstColour(wx.Colour('#5c5c5c')) style.SetSecondColour(wx.Colour('#5c5c5c')) panel_bar.ApplyCaptionStyleAll(style) self._mainsizer.Add(panel_bar, 1, wx.EXPAND | wx.ALL) self._mainsizer.Layout() # Also bind the focus handler to the main panel and panel_bar nodeinfo_pnl.Bind(wx.EVT_ENTER_WINDOW, self.OnAreaFocus) panel_bar.Bind(wx.EVT_ENTER_WINDOW, self.OnAreaFocus) else: # Delete the window if the node is not selected self._mainsizer.Clear(delete_windows=True) self.AUIManager.Update() self.Parent.Refresh() self.Parent.Update() def OnAreaFocus(self, event): self.Statusbar.PushContextHints(2, mouseicon=ICON_MOUSE_LMB, text="", clear=True) self.Statusbar.PushContextHints(3, mouseicon=ICON_MOUSE_MMB, text="") self.Statusbar.PushContextHints(4, mouseicon=ICON_MOUSE_RMB, text="") self.Statusbar.PushMessage(_("Node Properties Area")) self.Statusbar.UpdateStatusBar() def OnAreaMenuButton(self, event): self.CreateAreaMenu() pos = ComputeMenuPosAlignedLeft(self.area_dropdownmenu, self.menu_button) self.area_dropdownmenu.Popup(pos, self) def OnMenuUndockPanel(self, event): self.AUIManager.GetPane("nodeproperties").Float() self.AUIManager.Update() def OnMenuHidePanel(self, event): self.AUIManager.GetPane("nodeproperties").Hide() self.AUIManager.Update() def CreateAreaMenu(self): self.area_dropdownmenu = flatmenu.FlatMenu() undockpanel_menuitem = flatmenu.FlatMenuItem(self.area_dropdownmenu, ID_MENU_UNDOCKPANEL, _("Undock panel"), "", wx.ITEM_NORMAL) self.area_dropdownmenu.AppendItem(undockpanel_menuitem) hidepanel_menuitem = flatmenu.FlatMenuItem(self.area_dropdownmenu, ID_MENU_HIDEPANEL, _("Hide panel"), "", wx.ITEM_NORMAL) self.area_dropdownmenu.AppendItem(hidepanel_menuitem)
class NodeGraphPanel(wx.Panel): def __init__(self, parent, registry, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.NO_BORDER | wx.TAB_TRAVERSAL): wx.Panel.__init__(self, parent, id, pos, size, style) self.parent = parent self.registry = registry self.SetBackgroundColour(wx.Colour("#464646")) self.BuildUI() def BuildUI(self): main_sizer = wx.BoxSizer(wx.VERTICAL) topbar = wx.Panel(self) topbar.SetBackgroundColour("#424242") topbar_sizer = wx.GridBagSizer(vgap=1, hgap=1) self.area_icon = wx.StaticBitmap( topbar, bitmap=ICON_NODEGRAPH_PANEL.GetBitmap()) self.area_label = wx.StaticText(topbar, label="") self.area_label.SetForegroundColour("#fff") self.area_label.SetFont(self.area_label.GetFont().Bold()) self.zoom_field = NumberField(topbar, default_value=100, label=_("Zoom"), min_value=25, max_value=250, suffix="%", show_p=False) self.menu_button = Button(topbar, label="", flat=True, bmp=(ICON_MORE_MENU_SMALL.GetBitmap(), 'left')) topbar_sizer.Add(self.area_icon, (0, 0), flag=wx.LEFT | wx.TOP | wx.BOTTOM, border=8) topbar_sizer.Add(self.area_label, (0, 1), flag=wx.ALL, border=8) topbar_sizer.Add(self.zoom_field, (0, 3), flag=wx.ALL, border=3) topbar_sizer.Add(self.menu_button, (0, 4), flag=wx.ALL, border=3) topbar_sizer.AddGrowableCol(2) topbar.SetSizer(topbar_sizer) self.nodegraph = NodeGraph(self, self.registry, size=(-1, self.Size[0] - 20)) # here for testing self.nodegraph.AddNode('image_node', wx.Point(100, 10)) self.nodegraph.AddNode('image_node', wx.Point(400, 100)) self.nodegraph.AddNode('blur_node', wx.Point(600, 200)) self.nodegraph.AddNode('mix_node', wx.Point(100, 200)) self.nodegraph.AddNode('output_node', wx.Point(300, 270)) main_sizer.Add(topbar, flag=wx.EXPAND | wx.LEFT | wx.RIGHT) main_sizer.Add(self.nodegraph, 1, flag=wx.EXPAND | wx.BOTH) self.SetSizer(main_sizer) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODESELECT, self.UpdateNodePropertiesPnl) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODECONNECT, self.NodeConnectEvent) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODEDISCONNECT, self.NodeDisconnectEvent) self.nodegraph.Bind(EVT_GSNODEGRAPH_MOUSEZOOM, self.ZoomNodeGraph) self.zoom_field.Bind(EVT_NUMBERFIELD_CHANGE, self.ChangeZoom) self.menu_button.Bind(EVT_BUTTON, self.OnAreaMenuButton) self.Bind(wx.EVT_MENU, self.OnMenuUndockPanel, id=ID_MENU_UNDOCKPANEL) self.Bind(wx.EVT_MENU, self.OnMenuHidePanel, id=ID_MENU_HIDEPANEL) self.nodegraph.Bind(wx.EVT_ENTER_WINDOW, self.OnAreaFocus) @property def AUIManager(self): return self.parent._mgr @property def NodeGraph(self): return self.nodegraph @property def PropertiesPanel(self): return self.parent.prop_pnl @property def Statusbar(self): return self.parent.statusbar @property def ImageViewport(self): return self.parent.imageviewport_pnl def UpdateNodePropertiesPnl(self, event): self.PropertiesPanel.UpdatePanelContents(event.value) def NodeConnectEvent(self, event): self.parent.Render() def NodeDisconnectEvent(self, event): pass def ChangeZoom(self, event): level = event.value / 100.0 self.nodegraph.SetZoomLevel(level) def ZoomNodeGraph(self, event): self.zoom_field.SetValue(event.value) self.zoom_field.UpdateDrawing() self.zoom_field.Refresh() def OnAreaFocus(self, event): self.Statusbar.PushContextHints(2, mouseicon=ICON_MOUSE_LMB_MOVEMENT, text=_("Box Select Nodes"), clear=True) self.Statusbar.PushContextHints(3, mouseicon=ICON_MOUSE_LMB, text=_("Select Node")) self.Statusbar.PushContextHints( 4, mouseicon=ICON_MOUSE_LMB, keyicon=ICON_KEY_CTRL, text=_("Connect Selected Node To Output")) self.Statusbar.PushContextHints(5, mouseicon=ICON_MOUSE_MMB_MOVEMENT, text=_("Pan Nodegraph")) self.Statusbar.PushContextHints(6, mouseicon=ICON_MOUSE_RMB, text=_("Node Context Menu")) self.Statusbar.PushMessage(_("Nodegraph Area")) self.Statusbar.UpdateStatusBar() def OnAreaMenuButton(self, event): self.CreateAreaMenu() pos = ComputeMenuPosAlignedLeft(self.area_dropdownmenu, self.menu_button) self.area_dropdownmenu.Popup(pos, self) def OnMenuUndockPanel(self, event): self.AUIManager.GetPane("nodegraph").Float() self.AUIManager.Update() def OnMenuHidePanel(self, event): self.AUIManager.GetPane("nodegraph").Hide() self.AUIManager.Update() def CreateAreaMenu(self): self.area_dropdownmenu = flatmenu.FlatMenu() undockpanel_menuitem = flatmenu.FlatMenuItem(self.area_dropdownmenu, ID_MENU_UNDOCKPANEL, _("Undock panel"), "", wx.ITEM_NORMAL) self.area_dropdownmenu.AppendItem(undockpanel_menuitem) hidepanel_menuitem = flatmenu.FlatMenuItem(self.area_dropdownmenu, ID_MENU_HIDEPANEL, _("Hide panel"), "", wx.ITEM_NORMAL) self.area_dropdownmenu.AppendItem(hidepanel_menuitem)
class OpenFileChooserProp(Property): """ Allows the user to select a file to open. (e.g: use this to open an .PNG, .JPG, .JPEG image, etc.) """ def __init__(self, idname, default="", dlg_msg="Choose file...", wildcard="All files (*.*)|*.*", btn_lbl="Choose...", label="", visible=True): Property.__init__(self, idname, default, label, visible) self.dlg_msg = dlg_msg self.wildcard = wildcard self.btn_lbl = btn_lbl self._RunErrorCheck() def _RunErrorCheck(self): if type(self.value) != str: raise TypeError("OpenFileChooserField value must be a string!") def GetDlgMessage(self): return self.dlg_msg def GetWildcard(self): return self.wildcard def GetBtnLabel(self): return self.btn_lbl def CreateUI(self, parent, sizer): fold_panel = self.CreateFoldPanel(sizer) pnl = wx.Panel(fold_panel) pnl.SetBackgroundColour(wx.Colour("#464646")) vbox = wx.BoxSizer(wx.VERTICAL) hbox = wx.BoxSizer(wx.HORIZONTAL) self.textcontrol = TextCtrl(pnl, value=self.GetValue(), style=wx.BORDER_SIMPLE, placeholder="", size=(-1, 32)) hbox.Add(self.textcontrol, proportion=1, flag=wx.EXPAND | wx.BOTH) self.button = Button(pnl, label=self.GetBtnLabel(), size=(-1, 32)) hbox.Add(self.button, flag=wx.LEFT, border=5) self.button.Bind(EVT_BUTTON, self.WidgetEvent) vbox.Add(hbox, flag=wx.EXPAND | wx.BOTH | wx.ALL, border=6) vbox.Fit(pnl) pnl.SetSizer(vbox) self.AddToFoldPanel(sizer, fold_panel, pnl, spacing=10) def WidgetEvent(self, event): dlg = wx.FileDialog(None, message=self.GetDlgMessage(), defaultDir=os.getcwd(), defaultFile="", wildcard=self.GetWildcard(), style=wx.FD_OPEN | wx.FD_CHANGE_DIR | wx.FD_FILE_MUST_EXIST | wx.FD_PREVIEW) if dlg.ShowModal() == wx.ID_OK: paths = dlg.GetPaths() self.SetValue(paths[0]) self.textcontrol.ChangeValue(self.GetValue())
def __init__(self, *args, **kwds): kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.SetSize((600, 800)) self.SetBackgroundColour(wx.Colour("#464646")) sz = wx.BoxSizer(wx.VERTICAL) ctrl1 = NumberField(self, default_value=10, label="Resolution", min_value=0, max_value=25, suffix="px") ctrl2 = NumberField(self, default_value=98, label="Opacity", min_value=0, max_value=100, suffix="%") ctrl3 = NumberField(self, default_value=0, label="Radius", min_value=0, max_value=10, suffix="", show_p=False) ctrl4 = NumberField(self, default_value=50, label="X:", min_value=0, max_value=100, suffix="", show_p=False) ctrl5 = NumberField(self, default_value=13, label="Y:", min_value=0, max_value=100, suffix="", show_p=False) ctrl6 = TextCtrl(self, value="", style=wx.BORDER_SIMPLE, placeholder="", size=(-1, 24)) ctrl7 = NativeTextCtrl(self, size=(-1, 26)) ctrl8 = ColorPickerButton(self, label="Background Color:") ctrl9 = ColorPickerButton(self, label="Highlight Color:", default=(0, 54, 78, 215)) ctrl10 = ColorPickerButton(self, label="Text Color:", default=(255, 255, 255, 255)) ctrl11 = Button(self, label="Contrast", bmp=(TEST_ICON.GetBitmap(), 'left')) ctrl12 = Button(self, label="Render Image") ctrl13 = Button(self, label="Contrast", bmp=(TEST_ICON.GetBitmap(), 'top')) ctrl14 = Button(self, label="Choose Layer", bmp=(TEST_ICON.GetBitmap(), 'left')) sz2 = wx.BoxSizer(wx.HORIZONTAL) ctrl15 = Button(self, label="", bmp=(TEST_ICON.GetBitmap(), 'left')) ctrl16 = Button(self, label="", bmp=(TEST_ICON.GetBitmap(), 'left')) ctrl17 = Button(self, label="", bmp=(TEST_ICON.GetBitmap(), 'left')) ctrl18 = Button(self, label="", bmp=(TEST_ICON.GetBitmap(), 'left')) sz2.Add(ctrl15, flag=wx.EXPAND | wx.ALL, border=6) sz2.Add(ctrl16, flag=wx.EXPAND | wx.ALL, border=6) sz2.Add(ctrl17, flag=wx.EXPAND | wx.ALL, border=6) sz2.Add(ctrl18, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl1, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl2, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl3, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl4, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl5, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl6, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl7, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl8, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl9, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl10, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl11, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl12, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl13, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl14, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(sz2, border=20) self.SetSizer(sz) # Events self.Bind(EVT_NUMBERFIELD_CHANGE, self.OnFieldChange, ctrl1) self.Bind(EVT_NUMBERFIELD, self.OnField, ctrl1) self.Bind(EVT_BUTTON, self.OnColorChosen, ctrl8) self.Bind(EVT_BUTTON, self.OnColorChosen, ctrl9) self.Bind(EVT_BUTTON, self.OnColorChosen, ctrl10) self.Bind(EVT_BUTTON, self.OnButtonClick, ctrl11) self.Bind(EVT_BUTTON, self.OnButtonClick, ctrl12) self.Bind(EVT_BUTTON, self.OnButtonClick, ctrl13) self.Bind(EVT_BUTTON, self.OnButtonClick, ctrl14)