Esempio n. 1
0
    def add_multi_choice(self, name, key, value, status=None, enabled=True, **kwargs):
        """
        Add multi-choice values.

        :param name:
        :param key:
        :param value:
        :param status:
        :param enabled:
        :param kwargs:
        :return:
        """
        item = propgrid.MultiChoiceProperty(name,
                                            key,
                                            choices=value)

        self.Append(item)

        if status:
            self.SetPropertyHelpString(key, status)

        if enabled:
            self.EnableProperty(key)
        else:
            self.DisableProperty(key)

        return item
Esempio n. 2
0
    def OnClassChange(self, evt=None):
        self.grid.Freeze()
        self.grid.Clear()
        for attr in self.dialog.attribs.values():
            attr.items[self.grid] = None

        if self['ObjectClass'].GetSelection() == 0:
            self.EnableControls("DelObjectClass", False)
            selectedClasses = self.dialog.objectClasses
        else:
            self.EnableControls("DelObjectClass", True)
            selectedClasses = [self.ObjectClass]

        if selectedClasses:
            must, self.may = self.GetServer().GetClassSchemaMustMayOids(
                selectedClasses)
            ocoid = self.dialog.objectClassOid
            must.remove(ocoid)
            self.may.remove(ocoid)

            oids = self.dialog.attribs.keys()
            oids.remove(ocoid)

            for oid in must:
                if oid not in oids:
                    attr = self.GetServer().GetAttributeSchema(oid)
                    if attr:
                        logger.debug("Need attribute: %s %s", oid, attr.names)
                    else:
                        logger.debug("Need attribute without schema: %s", oid)

            for oid in oids:
                if oid in self.may:
                    self.addProp(oid)

            newOids = []
            for oid in self.may:
                if oid not in oids:
                    newOids.append(self.GetServer().GetName(oid))

            class MultiChoiceProperty(wxpg.PGProperty):
                pass

            if newOids:
                property = self.grid.Append(
                    wxpg.MultiChoiceProperty(xlt("<new>"), "", newOids, ""))
                self.grid.SetPropertyImage(
                    property, self.dialog.GetBitmap("attribEmpty"))

        self.grid.Thaw()
Esempio n. 3
0
    def _create_dummy_content(self):
        # some dummy content from the wxPython demo
        import wx.propgrid as wxpg
        pg = self.widget
        pg.AddPage( "Page 1 - Dummy" )

        pg.Append( wxpg.PropertyCategory("1 - Basic Properties") )
        pg.Append( wxpg.StringProperty("String",value="Some Text") )

        sp = pg.Append( wxpg.StringProperty('StringProperty w/ Password flag', value='ABadPassword') )
        sp.SetAttribute('Hint', 'This is a hint')
        sp.SetAttribute('Password', True)

        pg.Append( wxpg.IntProperty("Int",value=123) )
        pg.Append( wxpg.FloatProperty("Float",value=123.4) )
        pg.Append( wxpg.BoolProperty("Bool",value=True) )
        pg.Append( wxpg.BoolProperty("Bool_with_Checkbox",value=True) )
        pg.SetPropertyAttribute( "Bool_with_Checkbox", "UseCheckbox", True)
        pg.Append( wxpg.PropertyCategory("2 - More Properties") )
        pg.Append( wxpg.LongStringProperty("LongString", value="This is a\nmulti-line string\nwith\ttabs\nmixed\tin."))
        pg.Append( wxpg.DirProperty("Dir",value=r"C:\Windows") )
        pg.Append( wxpg.FileProperty("File",value=r"C:\Windows\system.ini") )
        pg.Append( wxpg.ArrayStringProperty("ArrayString",value=['A','B','C']) )

        pg.Append( wxpg.EnumProperty("Enum","Enum", ['wxPython Rules', 'wxPython Rocks', 'wxPython Is The Best'],
                                                    [10,11,12], 0) )
        pg.Append( wxpg.EditEnumProperty("EditEnum","EditEnumProperty", ['A','B','C'], [0,1,2], "Text Not in List") )

        pg.Append( wxpg.PropertyCategory("3 - Advanced Properties") )
        pg.Append( wxpg.DateProperty("Date",value=wx.DateTime.Now()) )
        pg.Append( wxpg.FontProperty("Font",value=self.widget.GetFont()) )
        pg.Append( wxpg.ColourProperty("Colour", value=self.widget.GetBackgroundColour()) )
        pg.Append( wxpg.SystemColourProperty("SystemColour") )
        pg.Append( wxpg.ImageFileProperty("ImageFile") )
        pg.Append( wxpg.MultiChoiceProperty("MultiChoice", choices=['wxWidgets','QT','GTK+']) )

        pg.Append( wxpg.PropertyCategory("4 - Additional Properties") )
        pg.Append( wxpg.IntProperty("IntWithSpin",value=256) )
        pg.SetPropertyEditor("IntWithSpin","SpinCtrl")

        pg.SetPropertyAttribute( "File", wxpg.PG_FILE_SHOW_FULL_PATH, 0 )
        pg.SetPropertyAttribute( "File", wxpg.PG_FILE_INITIAL_PATH, r"C:\Program Files\Internet Explorer" )
        if compat.IS_PHOENIX:
            pg.SetPropertyAttribute( "Date", wxpg.PG_DATE_PICKER_STYLE, wx.adv.DP_DROPDOWN|wx.adv.DP_SHOWCENTURY )

        pg.AddPage( "Page 2 - Almost Empty" )
        pg.Append( wxpg.PropertyCategory("1 - Basic Properties") )
        pg.Append( wxpg.StringProperty("String 2",value="Some Text") )
Esempio n. 4
0
    def _create_plot_properties(self):
        pg = self.property_grid_1
        # pg.AddPage("Page 1 - Plot Settings")  # if pages are needed, use PropertyGridManger instead
        dir_path = os.path.dirname(os.path.realpath(__file__))
        pg.Append(wxpg.PropertyCategory("1 - Basic Properties"))
        pg.Append(wxpg.StringProperty(label="Title", value="Title"))
        pg.Append(wxpg.StringProperty(label="X Label", value="X Label"))
        pg.Append(wxpg.StringProperty(label="Y Label", value="Y Label"))
        pg.Append(wxpg.BoolProperty(label="Grid", value=True))
        pg.SetPropertyAttribute(id="Grid", attrName="UseCheckbox", value=True)

        pg.Append(wxpg.PropertyCategory("2 - Data"))
        # https://discuss.wxpython.org/t/wxpython-pheonix-4-0-2-question-regarding-multichoiceproperty-and-setting-the-selection-of-the-choices/30044
        # https://discuss.wxpython.org/t/how-to-set-propertygrid-values/30152/4
        pg.Append(
            wxpg.EnumProperty(
                label="Scale",
                labels=['Linear', 'SemilogX', 'SemilogY', 'LogLog']))
        pg.Append(
            wxpg.EnumProperty(label="X Data",
                              name="X Data",
                              labels=['NaN'],
                              values=[0]))
        pg.Append(
            wxpg.MultiChoiceProperty(label="Y Data",
                                     name='Y Data',
                                     choices=['NaN'],
                                     value=['NaN']))
        pg.Append(
            wxpg.EnumProperty(label="Data Labels",
                              name="Data Labels",
                              labels=['NaN'],
                              values=[0]))

        pg.Append(wxpg.PropertyCategory("3 - Optional Static Plot Overlay"))
        pg.Append(wxpg.FileProperty(label="Overlay Plot",
                                    value=rf"{dir_path}"))
        pg.Append(wxpg.EnumProperty(label="X Axis Variable", labels=['']))
        pg.Append(wxpg.EnumProperty(label="Y Axis Variable", labels=['']))

        pg.Append(wxpg.PropertyCategory("4 - Advanced Properties"))
        pg.Append(wxpg.ArrayStringProperty(label="xLim", value=['0', '100']))
        pg.Append(wxpg.ArrayStringProperty(label="yLim", value=['0', '100']))
        pg.Append(wxpg.DateProperty(label="Date", value=wx.DateTime.Now()))
        pg.Append(wxpg.ColourProperty(label="Line Colour", value='#1f77b4'))
        pg.Append(wxpg.FontProperty(label="Font", value=self.GetFont()))
        pg.Grid.FitColumns()
Esempio n. 5
0
    def __init__(self, parent, log):
        wx.Panel.__init__(self, parent, wx.ID_ANY)
        self.log = log

        self.panel = panel = wx.Panel(self, wx.ID_ANY)
        topsizer = wx.BoxSizer(wx.VERTICAL)

        # Difference between using PropertyGridManager vs PropertyGrid is that
        # the manager supports multiple pages and a description box.
        self.pg = pg = wxpg.PropertyGridManager(
            panel,
            style=wxpg.PG_SPLITTER_AUTO_CENTER | wxpg.PG_AUTO_SORT
            | wxpg.PG_TOOLBAR)

        # Show help as tooltips
        pg.SetExtraStyle(wxpg.PG_EX_HELP_AS_TOOLTIPS)

        pg.Bind(wxpg.EVT_PG_CHANGED, self.OnPropGridChange)
        pg.Bind(wxpg.EVT_PG_PAGE_CHANGED, self.OnPropGridPageChange)
        pg.Bind(wxpg.EVT_PG_SELECTED, self.OnPropGridSelect)
        pg.Bind(wxpg.EVT_PG_RIGHT_CLICK, self.OnPropGridRightClick)

        #
        # Let's use some simple custom editor
        #
        # NOTE: Editor must be registered *before* adding a property that
        # uses it.
        if not getattr(sys, '_PropGridEditorsRegistered', False):
            pg.RegisterEditor(TrivialPropertyEditor)
            pg.RegisterEditor(SampleMultiButtonEditor)
            pg.RegisterEditor(LargeImageEditor)
            # ensure we only do it once
            sys._PropGridEditorsRegistered = True

        #
        # Add properties
        #

        pg.AddPage("Page 1 - Testing All")

        pg.Append(wxpg.PropertyCategory("1 - Basic Properties"))
        pg.Append(wxpg.StringProperty("String", value="Some Text"))

        sp = pg.Append(
            wxpg.StringProperty('StringProperty w/ Password flag',
                                value='ABadPassword'))
        sp.SetAttribute('Hint', 'This is a hint')
        sp.SetAttribute('Password', True)

        pg.Append(wxpg.IntProperty("Int", value=100))
        pg.Append(wxpg.FloatProperty("Float", value=100.0))
        pg.Append(wxpg.BoolProperty("Bool", value=True))
        boolprop = pg.Append(
            wxpg.BoolProperty("Bool_with_Checkbox", value=True))
        pg.SetPropertyAttribute(
            "Bool_with_Checkbox",  # You can find the property by name,
            #boolprop,               # or give the property object itself.
            "UseCheckbox",
            True)  # The attribute name and value

        pg.Append(wxpg.PropertyCategory("2 - More Properties"))
        pg.Append(
            wxpg.LongStringProperty(
                "LongString",
                value="This is a\nmulti-line string\nwith\ttabs\nmixed\tin."))
        pg.Append(wxpg.DirProperty("Dir", value=r"C:\Windows"))
        pg.Append(wxpg.FileProperty("File", value=r"C:\Windows\system.ini"))
        pg.Append(
            wxpg.ArrayStringProperty("ArrayString", value=['A', 'B', 'C']))

        pg.Append(
            wxpg.EnumProperty(
                "Enum", "Enum",
                ['wxPython Rules', 'wxPython Rocks', 'wxPython Is The Best'],
                [10, 11, 12], 0))
        pg.Append(
            wxpg.EditEnumProperty("EditEnum", "EditEnumProperty",
                                  ['A', 'B', 'C'], [0, 1, 2],
                                  "Text Not in List"))

        pg.Append(wxpg.PropertyCategory("3 - Advanced Properties"))
        pg.Append(wxpg.DateProperty("Date", value=wx.DateTime.Now()))
        pg.Append(wxpg.FontProperty("Font", value=panel.GetFont()))
        pg.Append(
            wxpg.ColourProperty("Colour", value=panel.GetBackgroundColour()))
        pg.Append(wxpg.SystemColourProperty("SystemColour"))
        pg.Append(wxpg.ImageFileProperty("ImageFile"))
        pg.Append(
            wxpg.MultiChoiceProperty("MultiChoice",
                                     choices=['wxWidgets', 'QT', 'GTK+']))

        pg.Append(wxpg.PropertyCategory("4 - Additional Properties"))
        #pg.Append( wxpg.PointProperty("Point",value=panel.GetPosition()) )
        pg.Append(SizeProperty("Size", value=panel.GetSize()))
        #pg.Append( wxpg.FontDataProperty("FontData") )
        pg.Append(wxpg.IntProperty("IntWithSpin", value=256))
        pg.SetPropertyEditor("IntWithSpin", "SpinCtrl")

        pg.SetPropertyAttribute("File", wxpg.PG_FILE_SHOW_FULL_PATH, 0)
        pg.SetPropertyAttribute("File", wxpg.PG_FILE_INITIAL_PATH,
                                r"C:\Program Files\Internet Explorer")
        pg.SetPropertyAttribute("Date", wxpg.PG_DATE_PICKER_STYLE,
                                wx.adv.DP_DROPDOWN | wx.adv.DP_SHOWCENTURY)

        pg.Append(wxpg.PropertyCategory("5 - Custom Properties and Editors"))
        pg.Append(IntProperty2("IntProperty2", value=1024))

        pg.Append(PyObjectProperty("PyObjectProperty"))

        pg.Append(DirsProperty("Dirs1", value=['C:/Lib', 'C:/Bin']))
        pg.Append(DirsProperty("Dirs2", value=['/lib', '/bin']))

        # Test another type of delimiter
        pg.SetPropertyAttribute("Dirs2", "Delimiter", '"')

        # SampleMultiButtonEditor
        pg.Append(wxpg.LongStringProperty("MultipleButtons"))
        pg.SetPropertyEditor("MultipleButtons", "SampleMultiButtonEditor")
        pg.Append(SingleChoiceProperty("SingleChoiceProperty"))

        # Custom editor samples
        prop = pg.Append(
            wxpg.StringProperty("StringWithCustomEditor", value="test value"))
        pg.SetPropertyEditor(prop, "TrivialPropertyEditor")

        pg.Append(wxpg.ImageFileProperty("ImageFileWithLargeEditor"))
        pg.SetPropertyEditor("ImageFileWithLargeEditor", "LargeImageEditor")

        # When page is added, it will become the target page for AutoFill
        # calls (and for other property insertion methods as well)
        pg.AddPage("Page 2 - Results of AutoFill will appear here")

        topsizer.Add(pg, 1, wx.EXPAND)

        rowsizer = wx.BoxSizer(wx.HORIZONTAL)
        but = wx.Button(panel, -1, "SetPropertyValues")
        but.Bind(wx.EVT_BUTTON, self.OnSetPropertyValues)
        rowsizer.Add(but, 1)
        but = wx.Button(panel, -1, "GetPropertyValues")
        but.Bind(wx.EVT_BUTTON, self.OnGetPropertyValues)
        rowsizer.Add(but, 1)
        topsizer.Add(rowsizer, 0, wx.EXPAND)
        rowsizer = wx.BoxSizer(wx.HORIZONTAL)
        but = wx.Button(panel, -1, "GetPropertyValues(as_strings=True)")
        but.Bind(wx.EVT_BUTTON, self.OnGetPropertyValues2)
        rowsizer.Add(but, 1)
        but = wx.Button(panel, -1, "AutoFill")
        but.Bind(wx.EVT_BUTTON, self.OnAutoFill)
        rowsizer.Add(but, 1)
        topsizer.Add(rowsizer, 0, wx.EXPAND)
        rowsizer = wx.BoxSizer(wx.HORIZONTAL)
        but = wx.Button(panel, -1, "Delete")
        but.Bind(wx.EVT_BUTTON, self.OnDeleteProperty)
        rowsizer.Add(but, 1)
        but = wx.Button(panel, -1, "Run Tests")
        but.Bind(wx.EVT_BUTTON, self.RunTests)
        rowsizer.Add(but, 1)
        topsizer.Add(rowsizer, 0, wx.EXPAND)

        panel.SetSizer(topsizer)
        topsizer.SetSizeHints(panel)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(panel, 1, wx.EXPAND)
        self.SetSizer(sizer)
        self.SetAutoLayout(True)
Esempio n. 6
0
    def InitMatrice(self, matrice):
        # Compose la grille de saisie des paramètres selon le dictionnaire matrice
        self.matrice = matrice
        self.dicProperties = {}
        chapitre = self.matrice['nomchapitre']
        if isinstance(chapitre, str):
            self.Append(wxpg.PropertyCategory(chapitre))
        for ligne in self.matrice['lignes']:
            if 'name' in ligne and 'genre' in ligne:
                if not 'label' in ligne: ligne['name'] = None
                if not 'value' in ligne: ligne['value'] = None
                genre, name, label, value = (ligne['genre'], ligne['name'],
                                             ligne['label'], ligne['value'])
                genre = genre.lower()
                if not 'labels' in ligne: ligne['labels'] = []
                """
                if 'values' in ligne and ligne['values']:
                    if ligne['labels']:
                        if len(ligne['values']) > 0 and len(ligne['labels']) == 0:
                            ligne['labels'] = ligne['values']
                    else: ligne['labels'] = ligne['values']
                """
                commande = ''
                try:
                    commande = genre
                    if genre in ['enum', 'combo']:
                        values = list(range(0, len(ligne['labels'])))
                        if not isinstance(value, int): value = 0
                        choix = wxpg.PGChoices(ligne['labels'], values=values)
                        propriete = wxpg.EnumProperty(label=label,
                                                      name=name,
                                                      choices=choix,
                                                      value=value)

                    elif genre == 'multichoice':
                        propriete = wxpg.MultiChoiceProperty(
                            label, name, choices=ligne['labels'], value=value)

                    elif genre in ['bool', 'check']:
                        wxpg.PG_BOOL_USE_CHECKBOX = 1
                        propriete = wxpg.BoolProperty(label=label,
                                                      name=name,
                                                      value=value)
                        propriete.PG_BOOL_USE_CHECKBOX = 1

                    elif genre in ['date', 'datetime', 'time']:
                        wxpg.PG_BOOL_USE_CHECKBOX = 1
                        propriete = wxpg.DateProperty(label=label,
                                                      name=name,
                                                      value=value)
                        propriete.SetFormat('%d/%m/%Y')
                        propriete.PG_BOOL_USE_CHECKBOX = 1

                    else:
                        commande = "wxpg."  + genre.upper()[:1] + genre.lower()[1:] \
                                            + "Property(label= label, name=name, value=value)"
                        propriete = eval(commande)
                    if 'help' in ligne:
                        propriete.SetHelpString(ligne['help'])
                    self.Append(propriete)
                    self.dicProperties[propriete] = name
                    self.dicProperties[name] = propriete
                except Exception as err:
                    wx.MessageBox(
                        "Echec sur Property de name - value: %s - %s (%s)\nLe retour d'erreur est : \n%s\n\nSur commande : %s"
                        % (name, value, type(value), err, commande),
                        'CTRL_property.InitMatrice() : Paramètre ligne indigeste !',
                        wx.OK | wx.ICON_STOP)
Esempio n. 7
0
 def test_propgridadvprops09(self):
     p = pg.MultiChoiceProperty()
     p = pg.MultiChoiceProperty('label', 'name',
                                choices=['The', 'Quick', 'Brown', 'Fox'],
                                value=['Brown', 'Fox'])
Esempio n. 8
0
    def __init__(self, parent, log):
        # Use the WANTS_CHARS style so the panel doesn't eat the Return key.
        wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)

        self.log = log
        tID = wx.NewId()

        topsizer = wx.BoxSizer(wx.VERTICAL)

        # Difference between using PropertyGridManager vs PropertyGrid is that
        # the manager supports multiple pages and a description box.
        self.pg = pg = wxpg.PropertyGridManager(
            self,
            style=wxpg.PG_SPLITTER_AUTO_CENTER | wxpg.PG_AUTO_SORT
            | wxpg.PG_TOOLBAR)  # |wxpg.PG_DESCRIPTION
        #self.pg = pg = wxpg.PropertyGrid(self,
        #    style=wxpg.PG_SPLITTER_AUTO_CENTER|wxpg.PG_AUTO_SORT)

        # Show help as tooltips
        pg.SetExtraStyle(wxpg.PG_EX_HELP_AS_TOOLTIPS
                         | wxpg.PG_EX_MULTIPLE_SELECTION)

        pg.Bind(wxpg.EVT_PG_CHANGED, self.OnPropGridChange)
        pg.Bind(wxpg.EVT_PG_PAGE_CHANGED, self.OnPropGridPageChange)
        pg.Bind(wxpg.EVT_PG_SELECTED, self.OnPropGridSelect)
        pg.Bind(wxpg.EVT_PG_RIGHT_CLICK, self.OnPropGridRightClick)

        # Needed by custom image editor
        wx.InitAllImageHandlers()

        #
        # Let's use some simple custom editor
        #
        # NOTE: Editor must be registered *before* adding a property that
        # uses it.
        pg.RegisterEditor(TrivialPropertyEditor)
        pg.RegisterEditor(LargeImageEditor)

        #
        # Add properties
        #

        pg.AddPage("Page 1 - Testing All")

        pg.Append(wxpg.PropertyCategory("1 - Basic Properties"))

        pg.Append(wxpg.StringProperty("String", value="Some Text"))
        pg.Append(wxpg.IntProperty("Int", value=100))
        pg.Append(wxpg.FloatProperty("Float", value=100.0))
        pg.Append(wxpg.BoolProperty("Bool", value=True))
        pg.Append(wxpg.BoolProperty("Bool_with_Checkbox", value=True))
        pg.SetPropertyAttribute("Bool_with_Checkbox", "UseCheckbox", True)

        pg.Append(wxpg.PropertyCategory("2 - More Properties"))
        pg.Append(
            wxpg.LongStringProperty(
                "LongString",
                value=
                "This is a\\nmulti-line string\\nwith\\ttabs\\nmixed\\tin."))
        pg.Append(wxpg.DirProperty("Dir", value="C:\\Windows"))
        pg.Append(wxpg.FileProperty("File", value="C:\\Windows\\system.ini"))
        pg.Append(
            wxpg.ArrayStringProperty("ArrayString", value=['A', 'B', 'C']))

        pg.Append(
            wxpg.EnumProperty(
                "Enum", "Enum",
                ['wxPython Rules', 'wxPython Rocks', 'wxPython Is The Best'],
                [10, 11, 12], 0))
        pg.Append(
            wxpg.EditEnumProperty("EditEnum", "EditEnumProperty",
                                  ['A', 'B', 'C'], [0, 1, 2],
                                  "Text Not in List"))

        pg.Append(wxpg.PropertyCategory("3 - Advanced Properties"))
        pg.Append(wxpg.DateProperty("Date", value=wx.DateTime_Now()))
        pg.Append(wxpg.FontProperty("Font", value=self.GetFont()))
        pg.Append(
            wxpg.ColourProperty("Colour", value=self.GetBackgroundColour()))
        pg.Append(wxpg.SystemColourProperty("SystemColour"))
        pg.Append(wxpg.ImageFileProperty("ImageFile"))
        pg.Append(
            wxpg.MultiChoiceProperty("MultiChoice",
                                     choices=['wxWidgets', 'QT', 'GTK+']))

        pg.Append(wxpg.PropertyCategory("4 - Additional Properties"))
        pg.Append(wxpg.PointProperty("Point", value=self.GetPosition()))
        pg.Append(wxpg.SizeProperty("Size", value=self.GetSize()))
        pg.Append(wxpg.FontDataProperty("FontData"))
        pg.Append(wxpg.IntProperty("IntWithSpin", value=256))
        pg.SetPropertyEditor("IntWithSpin", "SpinCtrl")
        pg.Append(wxpg.DirsProperty("Dirs", value=['C:/Lib', 'C:/Bin']))
        pg.SetPropertyHelpString("String", "String Property help string!")
        pg.SetPropertyHelpString("Dirs", "Dirs Property help string!")

        pg.SetPropertyAttribute("File", wxpg.PG_FILE_SHOW_FULL_PATH, 0)
        pg.SetPropertyAttribute("File", wxpg.PG_FILE_INITIAL_PATH,
                                "C:\\Program Files\\Internet Explorer")
        pg.SetPropertyAttribute("Date", wxpg.PG_DATE_PICKER_STYLE,
                                wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)

        pg.Append(wxpg.PropertyCategory("5 - Custom Properties"))
        pg.Append(IntProperty2("IntProperty2", value=1024))
        pg.Append(
            RectProperty("RectProperty", value=wx.Rect(100, 200, 300, 400)))

        pg.Append(ShapeProperty("ShapeProperty", value=0))
        pg.Append(PyObjectProperty("PyObjectProperty"))

        prop = pg.Append(
            wxpg.StringProperty("StringWithCustomEditor", value="test value"))
        pg.SetPropertyEditor(prop, "TrivialPropertyEditor")

        pg.Append(wxpg.ImageFileProperty("ImageFileWithLargeEditor"))
        pg.SetPropertyEditor("ImageFileWithLargeEditor", "LargeImageEditor")

        # When page is added, it will become the target page for AutoFill
        # calls (and for other property insertion methods as well)
        pg.AddPage("Page 2 - Results of AutoFill will appear here")

        pg.SetPropertyClientData("Point", 1234)
        if pg.GetPropertyClientData("Point") != 1234:
            raise ValueError("Set/GetPropertyClientData() failed")

        # Test setting unicode string
        pg.GetPropertyByName("String").SetValue(u"Some Unicode Text")

        #
        # Test some code that *should* fail (but not crash)
        try:
            a_ = pg.GetPropertyValue("NotARealProperty")
            pg.EnableProperty("NotAtAllRealProperty", False)
            pg.SetPropertyHelpString("AgaintNotARealProperty",
                                     "Dummy Help String")
        except:
            pass
            #raise

        topsizer.Add(pg, 1, wx.EXPAND)

        rowsizer = wx.BoxSizer(wx.HORIZONTAL)
        but = wx.Button(self, -1, "SetPropertyValues")
        but.Bind(wx.EVT_BUTTON, self.OnSetPropertyValues)
        rowsizer.Add(but, 1)
        but = wx.Button(self, -1, "GetPropertyValues")
        but.Bind(wx.EVT_BUTTON, self.OnGetPropertyValues)
        rowsizer.Add(but, 1)
        topsizer.Add(rowsizer, 0, wx.EXPAND)
        rowsizer = wx.BoxSizer(wx.HORIZONTAL)
        but = wx.Button(self, -1, "GetPropertyValues(as_strings=True)")
        but.Bind(wx.EVT_BUTTON, self.OnGetPropertyValues2)
        rowsizer.Add(but, 1)
        but = wx.Button(self, -1, "AutoFill")
        but.Bind(wx.EVT_BUTTON, self.OnAutoFill)
        rowsizer.Add(but, 1)
        topsizer.Add(rowsizer, 0, wx.EXPAND)
        rowsizer = wx.BoxSizer(wx.HORIZONTAL)
        but = wx.Button(self, -1, "Delete")
        but.Bind(wx.EVT_BUTTON, self.OnDeleteProperty)
        rowsizer.Add(but, 1)
        but = wx.Button(self, -1, "Run Tests")
        but.Bind(wx.EVT_BUTTON, self.RunTests)
        rowsizer.Add(but, 1)
        topsizer.Add(rowsizer, 0, wx.EXPAND)

        self.SetSizer(topsizer)
        topsizer.SetSizeHints(self)