diff --git a/TODO.rst b/TODO.rst index 7ba8ddbd..299fe3d6 100644 --- a/TODO.rst +++ b/TODO.rst @@ -203,5 +203,11 @@ Other Dev Stuff self-contained instead of some relying on files generated by others. This won't work if we want to run tests in parallel. + * Port these modules from gizmos in wxCode to a pure-python wx.lib implementation? + * DynamicSashWindow + * LEDNumberCtrl + * SplitTree ?? + * TreeListCtrl ?? (We have a treelist ctrl in dataview now) + * The Masked controls modules and demos need some help with Py3 compatibility. diff --git a/demo/Calendar.py b/demo/Calendar.py index d374cdbd..e4a54ccf 100644 --- a/demo/Calendar.py +++ b/demo/Calendar.py @@ -416,7 +416,7 @@ class PrintCalend: printout2 = SetPrintout(self) self.preview = wx.PrintPreview(printout, printout2, self.printData) - if not self.preview.Ok(): + if not self.preview.IsOk(): wx.MessageBox("There was a problem printing!", "Printing", wx.OK) return diff --git a/demo/CalendarCtrl.py b/demo/CalendarCtrl.py index 9e6f5e70..d9776cb9 100644 --- a/demo/CalendarCtrl.py +++ b/demo/CalendarCtrl.py @@ -2,7 +2,7 @@ import wx import wx.adv -from wx.adv import CalendarCtrl +from wx.adv import CalendarCtrl, GenericCalendarCtrl, CalendarDateAttr #---------------------------------------------------------------------- @@ -28,13 +28,13 @@ class TestPanel(wx.Panel): txt = wx.StaticText(self, -1, description) txt.Wrap(300) - # cal = self.cal = GenericCalendarCtrl(self, -1, wx.DateTime().Today(), - # style = wx.adv.CAL_SHOW_HOLIDAYS - # | wx.adv.CAL_SUNDAY_FIRST - # | wx.adv.CAL_SEQUENTIAL_MONTH_SELECTION - # ) + cal = GenericCalendarCtrl(self, -1, wx.DateTime().Today(), + style = wx.adv.CAL_SHOW_HOLIDAYS + | wx.adv.CAL_SUNDAY_FIRST + | wx.adv.CAL_SEQUENTIAL_MONTH_SELECTION + ) - # cal2 = wxcal.GenericCalendarCtrl(self, -1, wx.DateTime().Today()) + cal2 = GenericCalendarCtrl(self, -1, wx.DateTime().Today()) # Track a few holidays @@ -43,9 +43,9 @@ class TestPanel(wx.Panel): # bind some event handlers to each calendar - for c in [native]:#, cal, cal2 + for c in [native, cal, cal2]: c.Bind(wx.adv.EVT_CALENDAR, self.OnCalSelected) - ## c.Bind(wx.adv.EVT_CALENDAR_MONTH, self.OnChangeMonth) + c.Bind(wx.adv.EVT_CALENDAR_MONTH, self.OnChangeMonth) c.Bind(wx.adv.EVT_CALENDAR_SEL_CHANGED, self.OnCalSelChanged) c.Bind(wx.adv.EVT_CALENDAR_WEEKDAY_CLICKED, self.OnCalWeekdayClicked) @@ -53,15 +53,17 @@ class TestPanel(wx.Panel): fgs = wx.FlexGridSizer(cols=2, hgap=50, vgap=50) fgs.Add(native) fgs.Add(txt) - # fgs.Add(cal) - # fgs.Add(cal2) + fgs.Add(cal) + fgs.Add(cal2) box = wx.BoxSizer() box.Add(fgs, 1, wx.EXPAND|wx.ALL, 25) self.SetSizer(box) def OnCalSelected(self, evt): - self.log.write('OnCalSelected: %s\n' % evt.GetDate()) + self.log.write('OnCalSelected: %s\n' % evt.Date) + if evt.Date.month == wx.DateTime.Aug and evt.Date.day == 14: + self.log.write("HAPPY BIRTHDAY!") def OnCalWeekdayClicked(self, evt): self.log.write('OnCalWeekdayClicked: %s\n' % evt.GetWeekDay()) @@ -86,7 +88,7 @@ class TestPanel(wx.Panel): # August 14th is a special day, mark it with a blue square... if cur_month == 8: - attr = wxcal.CalendarDateAttr(border=wx.adv.CAL_BORDER_SQUARE, + attr = CalendarDateAttr(border=wx.adv.CAL_BORDER_SQUARE, colBorder="blue") cal.SetAttr(14, attr) else: diff --git a/demo/ColourSelect.py b/demo/ColourSelect.py index 401a4144..c1519518 100644 --- a/demo/ColourSelect.py +++ b/demo/ColourSelect.py @@ -36,7 +36,7 @@ class TestColourSelect(wx.Panel): "and wxColourDialog Classes. Click Button to get Colour Values") mainSizer.Add(t, 0, wx.ALL, 3) - b = wx.Button(self, -1, "Show All Colours") + b = wx.Button(self, -1, "Log All Current Colours") self.Bind(wx.EVT_BUTTON, self.OnShowAll, id=b.GetId()) mainSizer.Add(b, 0, wx.ALL, 3) @@ -55,7 +55,7 @@ class TestColourSelect(wx.Panel): # build several examples of buttons with different colours and sizes buttonData = [ ("Default Size", (255, 255, 0), wx.DefaultSize, ""), - ("Another Size", (255, 0, 255), (60, 20), ""), + ("Another Size", (255, 0, 255), (60, 22), ""), ("Another Colour", (0, 255, 0), wx.DefaultSize, ""), ("Larger Size", (0, 0, 255), (60, 60), ""), ("With a Label", (127, 0, 255), wx.DefaultSize, "Colour..."), diff --git a/demo/ComboCtrl.py b/demo/ComboCtrl.py index 3d6f3e35..23074c98 100644 --- a/demo/ComboCtrl.py +++ b/demo/ComboCtrl.py @@ -112,7 +112,7 @@ class TestPanel(wx.Panel): self.log = log wx.Panel.__init__(self, parent, -1) - comboCtrl = wx.ComboCtrl(self, wx.ID_ANY, "") + comboCtrl = wx.ComboCtrl(self, wx.ID_ANY, "", (20,20)) popupCtrl = ListCtrlComboPopup() diff --git a/demo/CommandLinkButton.py b/demo/CommandLinkButton.py index 9c49971b..fdbc4a4d 100644 --- a/demo/CommandLinkButton.py +++ b/demo/CommandLinkButton.py @@ -2,6 +2,7 @@ import wx import wx.adv +from textwrap import dedent #---------------------------------------------------------------------- @@ -10,14 +11,14 @@ class TestPanel(wx.Panel): self.log = log wx.Panel.__init__(self, parent, -1) - cmd = wx.adv.CommandLinkButton(self, -1, - "wx.CommandLinkButton", - """\ -This type of button includes both a main label and a 'note' that is meant to -contain a description of what the button does or what it is used for. On -Windows 7 it is a new native widget type, on the other platforms it is -implemented generically.""", - pos=(25,25)) + cmd = wx.adv.CommandLinkButton(self, -1, "wx.CommandLinkButton", + dedent("""\ + This type of button includes both a main label and a 'note' that + is meant to contain a description of what the button does or + what is used for. On Windows 7 it is a new native widget type, + on the other platforms it is implemented generically. + """), + pos=(25,25), size=(500,-1)) #---------------------------------------------------------------------- diff --git a/demo/ContextHelp.py b/demo/ContextHelp.py index aa4d7d95..f13f218c 100644 --- a/demo/ContextHelp.py +++ b/demo/ContextHelp.py @@ -63,7 +63,6 @@ class TestPanel(wx.Panel): sizer.Add(text) text.Bind(wx.EVT_HELP, self.OnCtxHelp2, text) - border = wx.BoxSizer(wx.VERTICAL) border.Add(sizer, 0, wx.ALL, 25) @@ -74,7 +73,8 @@ class TestPanel(wx.Panel): # On the second text control above, we intercept the help event. This is where # we process it. Anything could happen here. In this case we're just printing - # some stuff about it, then passing it on, at which point we see the help tip. + # some stuff about it, then passing it on with Skip(), at which point we + # see the help tip. def OnCtxHelp(self, evt): self.log.write("OnCtxHelp: %s" % evt) evt.Skip() diff --git a/demo/Cursor.py b/demo/Cursor.py index 812bb8e4..0ad2818c 100644 --- a/demo/Cursor.py +++ b/demo/Cursor.py @@ -94,7 +94,7 @@ class TestPanel(wx.Panel): image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 1) # make the image into a cursor - cursor = wx.CursorFromImage(image) + cursor = wx.Cursor(image) else: # create one of the stock (built-in) cursors diff --git a/demo/DelayedResult.py b/demo/DelayedResult.py index c6db2e28..def625bb 100644 --- a/demo/DelayedResult.py +++ b/demo/DelayedResult.py @@ -25,20 +25,19 @@ class FrameSimpleDelayedBase(wx.Frame): def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) pnl = wx.Panel(self) - self.checkboxUseDelayed = wx.CheckBox(pnl, -1, "Using delayedresult") + self.textUseDelayed = wx.StaticText(pnl, -1, "NOT using delayedresult") self.buttonGet = wx.Button(pnl, -1, "Get") self.buttonAbort = wx.Button(pnl, -1, "Abort") self.slider = wx.Slider(pnl, -1, 0, 0, 10, size=(100,-1), style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS) self.textCtrlResult = wx.TextCtrl(pnl, -1, "", style=wx.TE_READONLY) - self.checkboxUseDelayed.SetValue(1) - self.checkboxUseDelayed.Enable(False) self.buttonAbort.Enable(False) + vsizer = wx.BoxSizer(wx.VERTICAL) vsizer = wx.BoxSizer(wx.VERTICAL) hsizer = wx.BoxSizer(wx.HORIZONTAL) - vsizer.Add(self.checkboxUseDelayed, 0, wx.ALL, 10) + vsizer.Add(self.textUseDelayed, 0, wx.ALL, 10) hsizer.Add(self.buttonGet, 0, wx.ALL, 5) hsizer.Add(self.buttonAbort, 0, wx.ALL, 5) hsizer.Add(self.slider, 0, wx.ALL, 5) @@ -52,7 +51,6 @@ class FrameSimpleDelayedBase(wx.Frame): - class FrameSimpleDelayed(FrameSimpleDelayedBase): """This demos simplistic use of delayedresult module.""" @@ -61,14 +59,19 @@ class FrameSimpleDelayed(FrameSimpleDelayedBase): self.jobID = 0 self.abortEvent = delayedresult.AbortEvent() self.Bind(wx.EVT_CLOSE, self.handleClose) + self.textUseDelayed.SetLabel("USING delayedresult") + def setLog(self, log): self.log = log + def handleClose(self, event): - """Only needed because in demo, closing the window does not kill the + """ + Only needed because in demo, closing the window does not kill the app, so worker thread continues and sends result to dead frame; normally - your app would exit so this would not happen.""" + your app would exit so this would not happen. + """ if self.buttonAbort.IsEnabled(): self.log( "Exiting: Aborting job %s" % self.jobID ) self.abortEvent.set() @@ -88,9 +91,11 @@ class FrameSimpleDelayed(FrameSimpleDelayedBase): def _resultProducer(self, jobID, abortEvent): - """Pretend to be a complex worker function or something that takes + """ + Pretend to be a complex worker function or something that takes long time to run due to network access etc. GUI will freeze if this - method is not called in separate thread.""" + method is not called in separate thread. + """ import time count = 0 while not abortEvent() and count < 50: @@ -112,7 +117,7 @@ class FrameSimpleDelayed(FrameSimpleDelayedBase): assert jobID == self.jobID try: result = delayedResult.get() - except Exception, exc: + except Exception as exc: self.log( "Result for job %s raised exception: %s" % (jobID, exc) ) return @@ -125,6 +130,7 @@ class FrameSimpleDelayed(FrameSimpleDelayedBase): self.buttonAbort.Enable(False) + class FrameSimpleDirect(FrameSimpleDelayedBase): """This does not use delayedresult so the GUI will freeze while the GET is taking place.""" @@ -132,15 +138,17 @@ class FrameSimpleDirect(FrameSimpleDelayedBase): def __init__(self, *args, **kwargs): self.jobID = 1 FrameSimpleDelayedBase.__init__(self, *args, **kwargs) - self.checkboxUseDelayed.SetValue(False) - + + def setLog(self, log): self.log = log - + + def handleGet(self, event): - """Use delayedresult, this will compute result in separate - thread, and will affect GUI response because a thread is not - used.""" + """ + Not using delayedresult, this will compute result in the same thread, + and will affect GUI response because a thread is not used. + """ self.buttonGet.Enable(False) self.buttonAbort.Enable(True) @@ -148,18 +156,23 @@ class FrameSimpleDirect(FrameSimpleDelayedBase): result = self._resultProducer(self.jobID) self._resultConsumer( result ) + def _resultProducer(self, jobID): - """Pretend to be a complex worker function or something that takes + """ + Pretend to be a complex worker function or something that takes long time to run due to network access etc. GUI will freeze if this - method is not called in separate thread.""" + method is not called in separate thread. + """ import time time.sleep(5) return jobID + def handleAbort(self, event): """can never be called""" pass - + + def _resultConsumer(self, result): # output result self.log( "Got result for job %s: %s" % (self.jobID, result) ) diff --git a/demo/DragAndDrop.py b/demo/DragAndDrop.py index 2fdb41bd..b2d0be57 100644 --- a/demo/DragAndDrop.py +++ b/demo/DragAndDrop.py @@ -15,8 +15,6 @@ class ClipTextPanel(wx.Panel): wx.Panel.__init__(self, parent, -1) self.log = log - #self.SetFont(wx.Font(10, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False)) - sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add( wx.StaticText( @@ -42,7 +40,6 @@ class ClipTextPanel(wx.Panel): self.Bind(wx.EVT_BUTTON, self.OnPaste, id=ID_PasteBtn) self.Bind(wx.EVT_BUTTON, self.OnCopyBitmap, id=ID_BitmapBtn) - self.SetAutoLayout(True) self.SetSizer(sizer) @@ -71,6 +68,7 @@ class ClipTextPanel(wx.Panel): "Error" ) + def OnCopyBitmap(self, evt): dlg = wx.FileDialog(self, "Choose a bitmap to copy", wildcard="*.bmp") @@ -120,7 +118,7 @@ class OtherDropTarget(wx.DropTarget): def OnData(self, x, y, d): self.log.WriteText("OnData: %d, %d, %d\n" % (x, y, d)) self.GetData() - self.log.WriteText("%s\n" % self.do.GetFilenames()) + self.log.SetLabel("%s\n" % self.do.GetFilenames()) return d @@ -131,12 +129,10 @@ class MyFileDropTarget(wx.FileDropTarget): self.log = log def OnDropFiles(self, x, y, filenames): - self.window.SetInsertionPointEnd() - self.window.WriteText("\n%d file(s) dropped at %d,%d:\n" % - (len(filenames), x, y)) - - for file in filenames: - self.window.WriteText(file + '\n') + txt = "\n%d file(s) dropped at %d,%d:\n" % (len(filenames), x, y) + txt += '\n'.join(filenames) + self.window.SetLabel(txt) + return True class MyTextDropTarget(wx.TextDropTarget): @@ -146,7 +142,8 @@ class MyTextDropTarget(wx.TextDropTarget): self.log = log def OnDropText(self, x, y, text): - self.window.WriteText("(%d, %d)\n%s\n" % (x, y, text)) + self.window.SetLabel("(%d, %d)\n%s\n" % (x, y, text)) + return True def OnDragOver(self, x, y, d): return wx.DragCopy @@ -164,38 +161,32 @@ class FileDropPanel(wx.Panel): 0, wx.EXPAND|wx.ALL, 2 ) - self.text = wx.TextCtrl( - self, -1, "", - style = wx.TE_MULTILINE|wx.HSCROLL|wx.TE_READONLY - ) + self.text = wx.StaticText(self, -1, "", style=wx.ST_NO_AUTORESIZE|wx.BORDER_SIMPLE) + self.text.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) dt = MyFileDropTarget(self, log) self.text.SetDropTarget(dt) - sizer.Add(self.text, 1, wx.EXPAND) + sizer.Add(self.text, 1, wx.EXPAND|wx.ALL, 5) sizer.Add( wx.StaticText(self, -1, " \nDrag some text here:"), 0, wx.EXPAND|wx.ALL, 2 ) - self.text2 = wx.TextCtrl( - self, -1, "", - style = wx.TE_MULTILINE|wx.HSCROLL|wx.TE_READONLY - ) + self.text2 = wx.StaticText(self, -1, "", style=wx.ST_NO_AUTORESIZE|wx.BORDER_SIMPLE) + self.text2.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) dt = MyTextDropTarget(self.text2, log) self.text2.SetDropTarget(dt) - sizer.Add(self.text2, 1, wx.EXPAND) + sizer.Add(self.text2, 1, wx.EXPAND|wx.ALL, 5) self.SetAutoLayout(True) self.SetSizer(sizer) - def WriteText(self, text): - self.text.WriteText(text) + def SetLabel(self, text): + self.text.SetLabel(text) - def SetInsertionPointEnd(self): - self.text.SetInsertionPointEnd() #---------------------------------------------------------------------- diff --git a/demo/EditableListBox.py b/demo/EditableListBox.py index df96d407..0db17e8e 100644 --- a/demo/EditableListBox.py +++ b/demo/EditableListBox.py @@ -13,7 +13,7 @@ class TestPanel(wx.Panel): self.elb = wx.adv.EditableListBox( self, -1, "List of Stuff", (50,50), (250, 250), style=wx.adv.EL_DEFAULT_STYLE | - wx.adv.EL_NO_REORDER | + #wx.adv.EL_NO_REORDER | wx.adv.EL_ALLOW_NEW | wx.adv.EL_ALLOW_EDIT | wx.adv.EL_ALLOW_DELETE) diff --git a/demo/EventManager.py b/demo/EventManager.py index 16c0f5d4..6f0b3c3f 100644 --- a/demo/EventManager.py +++ b/demo/EventManager.py @@ -2,12 +2,13 @@ #--------------------------------------------------------------------------- # Name: EventManager.py -# Purpose: A module to demonstrate wxPython.lib.evtmgr.EventManager. +# Purpose: A module to demonstrate wx.lib.evtmgr.EventManager. # # Author: Robb Shecter (robb@acm.org) # # Created: 16-December-2002 -# Copyright: (c) 2002 by Robb Shecter (robb@acm.org) +# Copyright: (c) 2002-2016 by Robb Shecter (robb@acm.org), +# Total Control Software # Licence: wxWindows license #--------------------------------------------------------------------------- @@ -136,7 +137,7 @@ class InnerTile(wx.Window): FINAL_COLOR = wx.Colour( 20, 80,240) OFF_COLOR = wx.Colour(185,190,185) # Some pre-computation. - DELTAS = map(lambda a,b: b-a, START_COLOR.Get(), FINAL_COLOR.Get()) + DELTAS = list(map(lambda a,b: b-a, START_COLOR.Get(), FINAL_COLOR.Get())) START_COLOR_TUPLE = START_COLOR.Get() """ @@ -185,7 +186,8 @@ class InnerTile(wx.Window): self.makeColorFromTuple(mouseEvent.GetPosition()) - def makeColorFromTuple(self, (x, y)): + def makeColorFromTuple(self, xy): + x, y = xy MAX = 180.0 scaled = min((x + y) * self.factor, MAX) # In range [0..MAX] percent = scaled / MAX diff --git a/demo/FileCtrl.py b/demo/FileCtrl.py index 85e0e0cc..1682361e 100644 --- a/demo/FileCtrl.py +++ b/demo/FileCtrl.py @@ -18,9 +18,7 @@ class FileCtrl(wx.FileCtrl): pos=wx.DefaultPosition, size=wx.DefaultSize, name="filectrl", log=None): wx.FileCtrl.__init__(self, parent, id, defaultDirectory, defaultFilename, wildCard, style, pos, size, name) - - self.BackgroundColour = 'pink' - + self.log = log self.Bind(wx.EVT_FILECTRL_FILEACTIVATED, self.OnFileActivated) self.Bind(wx.EVT_FILECTRL_SELECTIONCHANGED, self.OnSelectionChanged) @@ -49,8 +47,12 @@ class TestPanel(wx.Panel): self.log = log wx.Panel.__init__(self, parent) - fc = FileCtrl(self, pos=(15,15), log=log) - + wx.StaticText(self, -1, + "This is a generic control with features like a file dialog", + pos=(10,10)) + fc = FileCtrl(self, pos=(10,35), log=log) + fc.SetSize((500,350)) + fc.BackgroundColour = 'sky blue' #--------------------------------------------------------------------------- diff --git a/demo/FileHistory.py b/demo/FileHistory.py index 014d4234..eb9428a5 100644 --- a/demo/FileHistory.py +++ b/demo/FileHistory.py @@ -6,12 +6,11 @@ import wx #---------------------------------------------------------------------- text = """\ -Right-click on the panel above the line to get a menu. This menu will -be managed by a FileHistory object and so the files you select will -automatically be added to the end of the menu and will be selectable -the next time the menu is viewed. The filename selected, either via the -Open menu item, or from the history, will be displayed in the log -window below. +Right-click on this panel to get a menu. This menu will be managed by a +FileHistory object and so the files you select will automatically be added to +the end of the menu and will be selectable the next time the menu is viewed. +The filename selected, either via the Open menu item, or from the history, +will be displayed in the log window below. """ #---------------------------------------------------------------------- diff --git a/demo/GIFAnimationCtrl.py b/demo/GIFAnimationCtrl.py deleted file mode 100644 index b80fa87d..00000000 --- a/demo/GIFAnimationCtrl.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python - -import wx -from wx.animate import GIFAnimationCtrl - -from Main import opj - -GIFNames = [ - 'bitmaps/AG00178_.gif', - 'bitmaps/BD13656_.gif', - 'bitmaps/AG00185_.gif', - 'bitmaps/AG00039_.gif', - 'bitmaps/AG00183_.gif', - 'bitmaps/AG00028_.gif', - ] - -#---------------------------------------------------------------------- - -class TestPanel(wx.Panel): - def __init__(self, parent, log): - self.log = log - wx.Panel.__init__(self, parent, -1) - - sizer = wx.FlexGridSizer(cols=3, hgap=5, vgap=5) - for name in GIFNames: - ani = GIFAnimationCtrl(self, -1, opj(name)) - ani.GetPlayer().UseBackgroundColour(True) - ani.Play() - sizer.Add(ani, 0, wx.ALL, 10) - - border = wx.BoxSizer() - border.Add(sizer, 1, wx.EXPAND|wx.ALL, 20) - self.SetSizer(border) - - -#---------------------------------------------------------------------- - -def runTest(frame, nb, log): - win = TestPanel(nb, log) - return win - -#---------------------------------------------------------------------- - - - -overview = """ -

wx.animate.GIFAnimationCtrl

- -wx.animate.GIFAnimationCtrl is like a wx.StaticBitmap but is able to -display an animation by extracing frames from a multi-images GIF file. - - -""" - - - -if __name__ == '__main__': - import sys,os - import run - run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) - diff --git a/demo/Gauge.py b/demo/Gauge.py index e749b8d3..34df7677 100644 --- a/demo/Gauge.py +++ b/demo/Gauge.py @@ -12,11 +12,11 @@ class TestPanel(wx.Panel): wx.StaticText(self, -1, "This example shows the wx.Gauge control.", (45, 15)) - self.g1 = wx.Gauge(self, -1, 50, (110, 50), (250, 25)) - self.g2 = wx.Gauge(self, -1, 75, (110, 95), (250, 25)) - self.g3 = wx.Gauge(self, -1, 100, (110, 135), (25, 100), wx.GA_VERTICAL) - # self.g3.SetBezelFace(12) - # self.g3.SetShadowWidth(8) + self.g1 = wx.Gauge(self, -1, 50, (110, 50), (250, -1)) + self.g2 = wx.Gauge(self, -1, 75, (110, 95), (250, -1)) + + if 'wxMac' not in wx.PlaformInfo: + self.g3 = wx.Gauge(self, -1, 100, (110, 135), (-1, 100), wx.GA_VERTICAL) self.Bind(wx.EVT_TIMER, self.TimerHandler) self.timer = wx.Timer(self) @@ -33,7 +33,8 @@ class TestPanel(wx.Panel): self.g1.SetValue(self.count) self.g2.Pulse() - self.g3.Pulse() + if 'wxMac' not in wx.PlaformInfo: + self.g3.Pulse() #---------------------------------------------------------------------- diff --git a/demo/GridDragAndDrop.py b/demo/GridDragAndDrop.py index d1b9ba68..4ff3582c 100644 --- a/demo/GridDragAndDrop.py +++ b/demo/GridDragAndDrop.py @@ -32,6 +32,8 @@ class GridFileDropTarget(wx.FileDropTarget): self.grid.AutoSizeColumn(col) self.grid.Refresh() + return True + class FooTable(gridlib.GridTableBase): diff --git a/demo/GridDragable.py b/demo/GridDragable.py index 1a80d6dc..4fa2b3c6 100644 --- a/demo/GridDragable.py +++ b/demo/GridDragable.py @@ -63,7 +63,7 @@ class CustomDataTable(gridlib.GridTableBase): def GetValue(self, row, col): id = self.identifiers[col] - return self.data[row][id] + return str(self.data[row][id]) def SetValue(self, row, col, value): id = self.identifiers[col] diff --git a/demo/ItemsPicker.py b/demo/ItemsPicker.py index d800417f..2fd4bbd8 100644 --- a/demo/ItemsPicker.py +++ b/demo/ItemsPicker.py @@ -53,21 +53,30 @@ class ItemsPickerDialog(wx.Dialog): 'Stuff:', 'Selected stuff:',ipStyle = style) self.ip.Bind(EVT_IP_SELECTION_CHANGED, self.OnSelectionChange) self.ip._source.SetMinSize((-1,150)) - self.ip.bAdd.SetBitmap(_bp_btn2.GetBitmap(), dir=wx.RIGHT) - self.ip.bAdd.SetLabel('Add') - self.ip.bRemove.SetBitmap(_bp_btn1.GetBitmap(), dir=wx.LEFT) - self.ip.bRemove.SetLabel('Remove') + + # Customize the buttons for this example. + if 'wxMac' not in wx.PlatformInfo: + # NOTE: wx.Button on OSX does not modify the button size when adding a + # bitmap after the fact like this, and these bitmaps are a little too + # large and look funny in OSX, so we won't do this customization there. + self.ip.bAdd.SetBitmap(_bp_btn2.GetBitmap(), dir=wx.RIGHT) + self.ip.bAdd.SetLabel('Add') + self.ip.bRemove.SetBitmap(_bp_btn1.GetBitmap(), dir=wx.LEFT) + self.ip.bRemove.SetLabel('Remove') + sizer.Add(self.ip, 0, wx.ALL, 10) self.SetSizer(sizer) self.itemCount = 3 self.Fit() + def OnAdd(self,e): items = self.ip.GetItems() self.itemCount += 1 newItem = "item%d" % self.itemCount self.ip.SetItems(items + [newItem]) + def OnSelectionChange(self, e): self.log.write("EVT_IP_SELECTION_CHANGED %s\n" % \ ",".join(e.GetItems())) diff --git a/demo/Joystick.py b/demo/Joystick.py index e902a164..e5ff4b5a 100644 --- a/demo/Joystick.py +++ b/demo/Joystick.py @@ -888,7 +888,7 @@ class JoystickDemoPanel(wx.Panel): # Calibrate our controls wx.CallAfter(self.Calibrate) wx.CallAfter(self.OnJoystick) - except NotImplementedError, v: + except NotImplementedError as v: wx.MessageBox(str(v), "Exception Message") self.stick = None diff --git a/demo/ListCtrl_edit.py b/demo/ListCtrl_edit.py index 2a4c5ff8..ba752de6 100644 --- a/demo/ListCtrl_edit.py +++ b/demo/ListCtrl_edit.py @@ -40,6 +40,7 @@ class TestListCtrl(wx.ListCtrl, self.Populate() listmix.TextEditMixin.__init__(self) + def Populate(self): # for normal, simple columns, you can add them like this: self.InsertColumn(0, "Column 1") @@ -62,6 +63,7 @@ class TestListCtrl(wx.ListCtrl, self.currentItem = 0 + def SetStringItem(self, index, col, data): if col in range(3): wx.ListCtrl.SetItem(self, index, col, data) @@ -100,6 +102,7 @@ class TestListCtrlPanel(wx.Panel): style=wx.LC_REPORT | wx.BORDER_NONE | wx.LC_SORT_ASCENDING + | wx.LC_HRULES | wx.LC_VRULES ) sizer.Add(self.list, 1, wx.EXPAND) diff --git a/demo/MDIDemo.py b/demo/MDIDemo.py index 0179053a..4d148753 100644 --- a/demo/MDIDemo.py +++ b/demo/MDIDemo.py @@ -76,7 +76,6 @@ class MyParentFrame(wx.MDIParentFrame): if __name__ == '__main__': class MyApp(wx.App): def OnInit(self): - wx.InitAllImageHandlers() frame = MyParentFrame() frame.Show(True) self.SetTopWindow(frame) diff --git a/demo/MDISashDemo.py b/demo/MDISashDemo.py index b9a78e5b..e5d03d49 100644 --- a/demo/MDISashDemo.py +++ b/demo/MDISashDemo.py @@ -140,7 +140,6 @@ class MyParentFrame(wx.MDIParentFrame): if __name__ == '__main__': class MyApp(wx.App): def OnInit(self): - wx.InitAllImageHandlers() frame = MyParentFrame() frame.Show(True) self.SetTopWindow(frame) diff --git a/demo/MDIWindows.py b/demo/MDIWindows.py index 1764a3f6..0cd57096 100644 --- a/demo/MDIWindows.py +++ b/demo/MDIWindows.py @@ -36,21 +36,8 @@ class TestPanel(wx.Panel): exe, spawn = self.GetPyExecutable() spawn(os.P_NOWAIT, exe, exe, "MDISashDemo.py") - # TODO: This hack can be removed once we fix the way the Python - # app bundles are generated so that they are not bundling and - # pointing to an otherwise unused and non-GUI-friendly version of - # Python on OS X. def GetPyExecutable(self): - if 'wxMac' in wx.PlatformInfo: - # sys.executable will be wrong if running the demo from - # an app bundle. But the bundle is always using a system - # framework so just hardcode the path to it. - if sys.version[:3] == "2.4": - return '/usr/local/bin/pythonw', os.spawnl - else: - return '/usr/bin/pythonw', os.spawnl - else: - return sys.executable, os.spawnl + return sys.executable, os.spawnl #---------------------------------------------------------------------- diff --git a/demo/MVCTree.py b/demo/MVCTree.py deleted file mode 100644 index 0642a257..00000000 --- a/demo/MVCTree.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env python - -import os -import sys - -import wx -import wx.lib.mvctree as tree - -logger = None -def selchanging(evt): - logger.write("SelChanging!\n") - -def selchanged(evt): - logger.write("SelChange!\n") - logger.write(str(evt.node)) -def expanded(evt): - logger.write("Expanded\n") -def closed(evt): - logger.write("Closed!\n") -def key(evt): - logger.write("Key\n") -def add(evt): - logger.write("Add\n") -def delitem(evt): - logger.write("Delete\n") - -def runTest(frame, nb, log): - #f = wx.Frame(frame, -1, "MVCTree", (0,0), (200,500)) - global logger - logger = log - p = tree.MVCTree(nb, -1) - #f = wx.Frame(frame, -1, "MVCTree") - #p = tree.MVCTree(f, -1) - p.SetAssumeChildren(True) - p.SetModel(tree.LateFSTreeModel(os.path.normpath(os.getcwd() + os.sep +'..'))) - - #Uncomment this to enable live filename editing! -# p.AddEditor(FileEditor(p)) - - p.SetMultiSelect(True) - p.Bind(tree.EVT_MVCTREE_SEL_CHANGING, selchanging) - p.Bind(tree.EVT_MVCTREE_SEL_CHANGED, selchanged) - p.Bind(tree.EVT_MVCTREE_ITEM_EXPANDED, expanded) - p.Bind(tree.EVT_MVCTREE_ITEM_COLLAPSED, closed) - p.Bind(tree.EVT_MVCTREE_ADD_ITEM, add) - p.Bind(tree.EVT_MVCTREE_DELETE_ITEM, delitem) - p.Bind(tree.EVT_MVCTREE_KEY_DOWN, key) - - return p - #frame.otherWin = f - #f.Show(True) - #return None - - -overview = """\ - -MVCTree is a control which handles hierarchical data. It is -constructed in model-view-controller architecture, so the display of -that data, and the content of the data can be changed greatly without -affecting the other parts. - -Multiple selections are possible by holding down the Ctrl key. - -This demo shows the wxPython directory structure. The interesting part -is that the tree model is late-bound to the filesystem, so the -filenames are not retrieved until the directory is expanded. In -mvctree.py are models for generic data, and both the early and -late-bound filesystem models. - -There is also support for editing, though it's not enabled in this -demo, to avoid accidentally renaming files! - -""" - - -if __name__ == '__main__': - import sys,os - import run - run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) diff --git a/demo/Mask.py b/demo/Mask.py index 806543fe..5f0c2cdd 100644 --- a/demo/Mask.py +++ b/demo/Mask.py @@ -23,11 +23,10 @@ logicList = [ ('wx.XOR', wx.XOR), ] -if 'mac-cg' in wx.PlatformInfo: +if 'wxMac' in wx.PlatformInfo: # that's all, folks! logicList = [ ('wx.COPY', wx.COPY), - ('wx.INVERT', wx.INVERT), ('wx.XOR', wx.XOR), ] diff --git a/demo/MimeTypesManager.py b/demo/MimeTypesManager.py index ffb48477..e0054cea 100644 --- a/demo/MimeTypesManager.py +++ b/demo/MimeTypesManager.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python - #---------------------------------------------------------------------- # Name: wxMimeTypesManager # Purpose: Demonstrate use of wx.MimeTypesManager, wx.FileType @@ -299,21 +297,21 @@ class MimeTypesDemoPanel(wx.Panel): mime = ft.GetMimeType() or "" #------- OPEN command - cmd = ft.GetOpenCommand(filename, mime) + params = wx.FileType.MessageParameters(filename, mime) + cmd = ft.GetOpenCommand(params) self.opencommand.SetValue(convert(cmd)) #------- PRINT command - cmd = ft.GetPrintCommand(filename, mime) + cmd = ft.GetPrintCommand(params) self.printcommand.SetValue(convert(cmd)) #------- All commands - all = ft.GetAllCommands(filename, mime) + verbs, commands = ft.GetAllCommands(params) - if all is None: + if not verbs and not commands: self.allcommands.SetValue("") else: - verbs, commands = all - text = pprint.pformat(map(None, verbs, commands)) + text = pprint.pformat(list(zip(verbs, commands))) self.allcommands.SetValue(text) diff --git a/demo/MultiSash.py b/demo/MultiSash.py index 818c38fd..1903150f 100644 --- a/demo/MultiSash.py +++ b/demo/MultiSash.py @@ -47,11 +47,11 @@ class TestWindow(stc.StyledTextCtrl): wx.Font(fSize, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) ) - ## if self.doc: - ## self.SetDocPointer(self.doc) - ## else: - self.SetText(sampleText) - TestWindow.doc = self.GetDocPointer() + if self.doc: + self.SetDocPointer(self.doc) + else: + self.SetText(sampleText) + TestWindow.doc = self.GetDocPointer() def ShutDownDemo(self): diff --git a/demo/NotificationMessage.py b/demo/NotificationMessage.py index a78d1ccb..c7dfe990 100644 --- a/demo/NotificationMessage.py +++ b/demo/NotificationMessage.py @@ -1 +1 @@ -#!/usr/bin/env python import wx import wx.adv class TestPanel(wx.Panel): def __init__(self, parent, log): self.log = log wx.Panel.__init__(self, parent, -1) self.btn = wx.Button(self, -1, "Notify me of something...!", pos=(50,50)) self.btn.Bind(wx.EVT_BUTTON, self.OnButton) def OnButton(self, event): notify = wx.adv.NotificationMessage(title="Notify!", message="...you of something...\numm...Updates are Available.", parent=None, flags=wx.ICON_INFORMATION) notify.SetFlags( # wx.ICON_INFORMATION wx.ICON_WARNING # wx.ICON_ERROR ) # notify.SetTitle("Wooot") # notify.SetMessage("It's a message!") # notify.SetParent(self) notify.Show(timeout=1)#1 for short timeout, 100 for long timeout # notify.Close()# Hides the notification. def runTest(frame, nb, log): win = TestPanel(nb, log) return win #--------------------------------------------------------------------------- overview = """\ This class allows to show the user a message non intrusively. Currently it is implemented natively for Windows and GTK and uses (non-modal) dialogs for the display of the notifications under the other platforms. """ if __name__ == '__main__': import sys,os import run run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) \ No newline at end of file +#!/usr/bin/env python import wx import wx.adv class TestPanel(wx.Panel): def __init__(self, parent, log): self.log = log wx.Panel.__init__(self, parent, -1) self.btn = wx.Button(self, -1, "Notify me of something...!", pos=(50,50)) self.btn.Bind(wx.EVT_BUTTON, self.OnButton) def OnButton(self, event): notify = wx.adv.NotificationMessage( title="This is a Notification!", message="wxPython is awesome. Phoenix is awesomer! Python is awesomest!!\n\n" "The quick brown fox jumped over the lazy dog.", parent=None, flags=wx.ICON_INFORMATION) # Various options can be set after the message is created if desired. # notify.SetFlags(# wx.ICON_INFORMATION # wx.ICON_WARNING # # wx.ICON_ERROR # ) # notify.SetTitle("Wooot") # notify.SetMessage("It's a message!") # notify.SetParent(self) notify.Show(timeout=5) # 1 for short timeout, 100 for long timeout # notify.Close() # Hides the notification. def runTest(frame, nb, log): win = TestPanel(nb, log) return win #--------------------------------------------------------------------------- overview = """\ This class allows to show the user a message non intrusively. Currently it is implemented natively for Windows and GTK and uses (non-modal) dialogs for the display of the notifications under the other platforms. """ if __name__ == '__main__': import sys,os import run run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) \ No newline at end of file diff --git a/demo/Overlay.py b/demo/Overlay.py index 53e6df7e..65164cd8 100644 --- a/demo/Overlay.py +++ b/demo/Overlay.py @@ -26,7 +26,8 @@ class TestPanel(wx.Panel): self.endPos = None self.overlay = wx.Overlay() - self.cropbitmap = wx.Bitmap('bitmaps/cropshot24x20.png', wx.BITMAP_TYPE_PNG) + self.cropbitmap = wx.Bitmap('bitmaps/cropshot24x20.png') + self.honeyBitmap = wx.Bitmap('bitmaps/honeycomb300.png') self.wxPenStylesDict = OrderedDict([ ('Solid' , wx.PENSTYLE_SOLID), @@ -36,39 +37,47 @@ class TestPanel(wx.Panel): ('Dot Dash' , wx.PENSTYLE_DOT_DASH), ('User Dash' , wx.PENSTYLE_USER_DASH), ('Transparent' , wx.PENSTYLE_TRANSPARENT), - ('Stipple' , wx.PENSTYLE_STIPPLE), + #('Stipple' , wx.PENSTYLE_STIPPLE), ('BDiagonal Hatch' , wx.PENSTYLE_BDIAGONAL_HATCH), ('CrossDiag Hatch' , wx.PENSTYLE_CROSSDIAG_HATCH), ('FDiagonal Hatch' , wx.PENSTYLE_FDIAGONAL_HATCH), ('Cross Hatch' , wx.PENSTYLE_CROSS_HATCH), ('Horizontal Hatch' , wx.PENSTYLE_HORIZONTAL_HATCH), ('Vertical Hatch' , wx.PENSTYLE_VERTICAL_HATCH), - ('First Hatch' , wx.PENSTYLE_FIRST_HATCH), - ('Last Hatch' , wx.PENSTYLE_LAST_HATCH), ]) list = [] for key, value in self.wxPenStylesDict.items(): list.append(key) self.penstylesCombo = wx.ComboBox(self, -1, choices=list, - pos=(10, 5), size=(100, -1), + size=(150, -1), style=wx.CB_READONLY) self.penstylesCombo.SetSelection(0) self.penstylesCombo.SetToolTip('Pen Style') self.overlayPenWidth = wx.SpinCtrl(self, -1, value='', - pos=(120, 5), - size=(100, -1), + size=(75, -1), style=wx.SP_ARROW_KEYS, min=1, max=24, initial=1) self.overlayPenWidth.SetToolTip('Pen Width') - self.overlayPenColor = wx.ColourPickerCtrl(self, -1, colour=wx.BLUE, - pos=(230, 5), size=(100, -1)) + from wx.lib.colourselect import ColourSelect + self.overlayPenColor = ColourSelect(self, -1, colour=wx.BLUE) self.overlayPenColor.SetToolTip('Pen Color') + sizer = wx.BoxSizer(wx.HORIZONTAL) + sizer.Add(self.penstylesCombo, 0, wx.ALL, 5) + sizer.Add(self.overlayPenWidth, 0, wx.ALL, 5) + sizer.Add(self.overlayPenColor, 0, wx.ALL, 5) + box = wx.BoxSizer(wx.VERTICAL) + box.Add(sizer, 0) + box.Add((1,1), 1) + + self.SetSizer(box) + self.OnSize() + def OnLeftDown(self, event): # Capture the mouse and save the starting posiiton for the rubber-band self.CaptureMouse() @@ -77,6 +86,7 @@ class TestPanel(wx.Panel): self.SetFocus() ## print('OnLeftDown') + def OnMouseMove(self, event): if event.Dragging() and event.LeftIsDown(): evtPos = event.GetPosition() @@ -128,6 +138,7 @@ class TestPanel(wx.Panel): del odc # Make sure the odc is destroyed before the dc is. ## print('OnMouseMove') + def OnLeftUp(self, event): if self.HasCapture(): self.ReleaseMouse() @@ -146,7 +157,11 @@ class TestPanel(wx.Panel): self.overlay.Reset() ## print('OnLeftUp') + def OnSize(self, event=None): + if event: + event.Skip() + x, y = self.GetSize() if x <= 0 or y <= 0: return @@ -158,8 +173,9 @@ class TestPanel(wx.Panel): dc.SetBackground(self.background) dc.Clear() - dc.DrawBitmap(wx.Bitmap('bitmaps/snakey_render.png'), 10, 35) - dc.DrawBitmap(wx.Bitmap('bitmaps/honeycomb300.png'), 100, 210) + dc.DrawBitmap(self.honeyBitmap, 40, 40) + dc.SetFont(wx.Font(wx.FontInfo(18))) + dc.DrawText('Drag the mouse on this window.', 325, 100) del dc self.Refresh() diff --git a/demo/PopupWindow.py b/demo/PopupWindow.py index 0c964d1f..2428fbe8 100644 --- a/demo/PopupWindow.py +++ b/demo/PopupWindow.py @@ -69,7 +69,7 @@ class TestPopup(wx.PopupWindow): def OnRightUp(self, evt): self.Show(False) - self.Destroy() + wx.CallAfter(self.Destroy) diff --git a/demo/PrintFramework.py b/demo/PrintFramework.py index 8fae51c9..e7a29a07 100644 --- a/demo/PrintFramework.py +++ b/demo/PrintFramework.py @@ -34,7 +34,7 @@ class MyPrintout(wx.Printout): def HasPage(self, page): self.log.WriteText("MyPrintout.HasPage: %d\n" % page) - if page <= 2: + if page <= 2: # we only have 2 pages in this document return True else: return False @@ -80,7 +80,6 @@ class MyPrintout(wx.Printout): dc.SetDeviceOrigin(int(posX), int(posY)) #------------------------------------------- - self.canvas.DoDrawing(dc, True) dc.DrawText("Page: %d" % page, marginX/2, maxY-marginY) diff --git a/demo/Process.py b/demo/Process.py index 16f49eb9..c4f0fa5e 100644 --- a/demo/Process.py +++ b/demo/Process.py @@ -87,7 +87,8 @@ class TestPanel(wx.Panel): text = self.inp.GetValue() self.inp.SetValue('') self.log.write('OnSendText: "%s"\n' % text) - self.process.GetOutputStream().write(text + '\n') + text += '\n' + self.process.GetOutputStream().write(text.encode('utf-8')) self.inp.SetFocus() diff --git a/demo/RightTextCtrl.py b/demo/RightTextCtrl.py deleted file mode 100644 index c21c27c4..00000000 --- a/demo/RightTextCtrl.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python - -#####################################################################\ -# Note: This control is deprecated because wx.TextCtrl now supports | -# the wx.TE_RIGHT style flag, which makes this control completely | -# superfluous. | -#####################################################################/ - -import wx -import wx.lib.rightalign as right - -#---------------------------------------------------------------------- - -class TestPanel(wx.Panel): - def __init__(self, parent): - wx.Panel.__init__(self, parent, -1) - - fgs = wx.FlexGridSizer(cols=2, vgap=5, hgap=5) - - txt = wx.StaticText( - self, -1, - "These text controls will align their contents to\n" - "the right (on wxMSW) when they don't have focus.", - style=wx.ALIGN_RIGHT - ) - - fgs.Add(txt) - fgs.Add(right.RightTextCtrl(self, -1, "", size=(75, -1))) - - fgs.Add((10,10)) - fgs.Add(right.RightTextCtrl(self, -1, "123.45", size=(75, -1))) - - fgs.Add((10,10)) - fgs.Add(right.RightTextCtrl(self, -1, "234.56", size=(75, -1))) - - fgs.Add((10,10)) - fgs.Add(right.RightTextCtrl(self, -1, "345.67", size=(75, -1))) - - fgs.Add((10,10)) - fgs.Add(right.RightTextCtrl(self, -1, "456.78", size=(75, -1))) - - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(fgs, 0, wx.ALL, 25) - - self.SetSizer(sizer) - self.SetAutoLayout(True) - - - -#---------------------------------------------------------------------- - -def runTest(frame, nb, log): - win = TestPanel(nb) - return win - -#---------------------------------------------------------------------- - -overview = right.__doc__ - - -if __name__ == '__main__': - import sys,os - import run - run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) diff --git a/demo/RowColSizer.py b/demo/RowColSizer.py deleted file mode 100644 index 1770b74f..00000000 --- a/demo/RowColSizer.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python - -import wx -import wx.lib.rcsizer as rcs - -#---------------------------------------------------------------------- - -class TestPanel(wx.Panel): - def __init__(self, parent): - wx.Panel.__init__(self, parent, -1) - - sizer = rcs.RowColSizer() - - text = "This sizer lays out it's items by row and column "\ - "that are specified explicitly when the item is \n"\ - "added to the sizer. Grid cells with nothing in "\ - "them are supported and column- or row-spanning is \n"\ - "handled as well. Growable rows and columns are "\ - "specified just like the wxFlexGridSizer." - - sizer.Add(wx.StaticText(self, -1, text), row=1, col=1, colspan=5) - - sizer.Add(wx.TextCtrl(self, -1, "(3,1)"), flag=wx.EXPAND, row=3, col=1) - sizer.Add(wx.TextCtrl(self, -1, "(3,2)"), row=3, col=2) - sizer.Add(wx.TextCtrl(self, -1, "(3,3)"), row=3, col=3) - sizer.Add(wx.TextCtrl(self, -1, "(3,4)"), row=3, col=4) - sizer.Add( - wx.TextCtrl(self, -1, "(4,2) span:(2,2)"), - flag=wx.EXPAND, row=4, col=2, rowspan=2, colspan=2 - ) - - sizer.Add(wx.TextCtrl(self, -1, "(6,4)"), row=6, col=4) - sizer.Add(wx.TextCtrl(self, -1, "(7,2)"), row=7, col=2) - sizer.Add(wx.TextCtrl(self, -1, "(8,3)"), row=8, col=3) - sizer.Add( - wx.TextCtrl(self, -1, "(10,1) colspan: 4"), - flag=wx.EXPAND, pos=(10,1), colspan=4 - ) - - sizer.Add( - wx.TextCtrl(self, -1, "(3,5) rowspan: 8, growable col", style=wx.TE_MULTILINE), - flag=wx.EXPAND, pos=(3,5), size=(8,1) - ) - - box = wx.BoxSizer(wx.VERTICAL) - box.Add(wx.Button(self, -1, "A vertical box"), flag=wx.EXPAND) - box.Add(wx.Button(self, -1, "sizer put in the"), flag=wx.EXPAND) - box.Add(wx.Button(self, -1, "RowColSizer at (12,1)"), flag=wx.EXPAND) - sizer.Add(box, pos=(12,1)) - - sizer.Add( - wx.TextCtrl(self, -1, "(12,2) align bottom"), - flag=wx.ALIGN_BOTTOM, pos=(12,2) - ) - - sizer.Add( - wx.TextCtrl(self, -1, "(12,3) align center"), - flag=wx.ALIGN_CENTER_VERTICAL, pos=(12,3) - ) - - sizer.Add(wx.TextCtrl(self, -1, "(12,4)"),pos=(12,4)) - sizer.Add( - wx.TextCtrl(self, -1, "(12,5) full border"), - flag=wx.EXPAND|wx.ALL, border=15, pos=(12,5) - ) - - sizer.AddGrowableCol(5) - sizer.AddGrowableRow(9) - - sizer.AddSpacer(10,10, pos=(1,6)) - sizer.AddSpacer(10,10, pos=(13,1)) - - self.SetSizer(sizer) - self.SetAutoLayout(True) - - -#---------------------------------------------------------------------- - -def runTest(frame, nb, log): - win = TestPanel(nb) - return win - - -#---------------------------------------------------------------------- - - -overview = rcs.__doc__ - -if __name__ == '__main__': - import sys,os - import run - run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) - diff --git a/demo/ScrolledWindow.py b/demo/ScrolledWindow.py index c57d9d5b..4f3f8a68 100644 --- a/demo/ScrolledWindow.py +++ b/demo/ScrolledWindow.py @@ -149,7 +149,7 @@ class MyCanvas(wx.ScrolledWindow): dc.SetPen(wx.Pen('MEDIUM FOREST GREEN', 4)) for line in self.lines: for coords in line: - apply(dc.DrawLine, coords) + dc.DrawLine(*coords) def SetXY(self, event): diff --git a/demo/Sizers.py b/demo/Sizers.py index c13f4d06..6d06b3ca 100644 --- a/demo/Sizers.py +++ b/demo/Sizers.py @@ -551,37 +551,35 @@ class TestSelectionPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) - self.list = wx.ListBox(self, -1, - (-1, -1), (-1, -1), - []) - self.list.Fit() + self.list = wx.ListBox(self, size=(300,150)) self.Bind(wx.EVT_LISTBOX, self.OnSelect, self.list) self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnDClick, self.list) btn = wx.Button(self, -1, "Try it!", (120, 10)) btn.Bind(wx.EVT_BUTTON, self.OnDClick) - self.text = wx.TextCtrl(self, -1, "", - (10, 115), - (200, 50), - wx.TE_MULTILINE | wx.TE_READONLY) + self.text = wx.TextCtrl(self, style = wx.TE_MULTILINE | wx.TE_READONLY) for item in theTests: self.list.Append(item[0]) + self.list.SetSelection(0) + wx.CallAfter(self.list.EnsureVisible, 0) + hsizer = wx.BoxSizer(wx.HORIZONTAL) hsizer.Add(self.list, 1, wx.ALL, 8) hsizer.Add(btn, 0, wx.ALL, 8) vsizer = wx.BoxSizer(wx.VERTICAL) vsizer.Add(hsizer) vsizer.Add(self.text, 1, wx.EXPAND | wx.ALL, 8) - self.SetSizerAndFit(vsizer) + self.SetSizer(vsizer) def OnSelect(self, event): pos = self.list.GetSelection() self.text.SetValue(theTests[pos][2]) + def OnDClick(self, event): pos = self.list.GetSelection() title = theTests[pos][0] diff --git a/demo/Slider.py b/demo/Slider.py index df4c6db6..503d19e5 100644 --- a/demo/Slider.py +++ b/demo/Slider.py @@ -10,15 +10,22 @@ class TestPanel(wx.Panel): self.log = log self.count = 0 - wx.StaticText(self, -1, "This is a wx.Slider.", (45, 15)) + label = wx.StaticText(self, -1, "This is a wx.Slider.") slider = wx.Slider( - self, 100, 25, 1, 100, (30, 60), (250, -1), - wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS + self, 100, 25, 1, 100, size=(250, -1), + style=wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS ) slider.SetTickFreq(5) + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add((1,20)) + sizer.Add(label, 0, wx.LEFT, 20) + sizer.Add((1,10)) + sizer.Add(slider, 0, wx.LEFT, 20) + self.SetSizer(sizer) + #---------------------------------------------------------------------- @@ -35,10 +42,6 @@ def runTest(frame, nb, log): overview = """\ A slider is a control with a handle which can be pulled back and forth to change the value. - -In Windows versions below Windows 95, a scrollbar is used to simulate the slider. -In Windows 95, the track bar control is used. - """ diff --git a/demo/Sound.py b/demo/Sound.py index c50543f9..96afa984 100644 --- a/demo/Sound.py +++ b/demo/Sound.py @@ -27,7 +27,7 @@ class TestPanel(wx.Panel): self.log.write("before Play...\n") sound.Play(wx.adv.SOUND_SYNC) self.log.write("...after Play\n") - except NotImplementedError, v: + except NotImplementedError as v: wx.MessageBox(str(v), "Exception Message") @@ -45,7 +45,7 @@ class TestPanel(wx.Panel): self.sound = sound # save a reference (This shoudln't be needed, but there seems to be a bug...) # wx.YieldIfNeeded() self.log.write("...after Play\n") - except NotImplementedError, v: + except NotImplementedError as v: wx.MessageBox(str(v), "Exception Message") @@ -62,7 +62,7 @@ class TestPanel(wx.Panel): # another way to do it. wx.adv.Sound.PlaySound(dlg.GetPath(), wx.adv.SOUND_SYNC) - except NotImplementedError, v: + except NotImplementedError as v: wx.MessageBox(str(v), "Exception Message") dlg.Destroy() diff --git a/demo/StaticBitmap.py b/demo/StaticBitmap.py index 75dad2b4..329b12d2 100644 --- a/demo/StaticBitmap.py +++ b/demo/StaticBitmap.py @@ -32,7 +32,6 @@ class TestPanel(wx.Panel): bmp = images.Robin.GetBitmap() StaticBitmap(self, -1, bmp, (80, 150)) - StaticText(self, -1, "Hey, if Ousterhout can do it, so can I.", (200, 175)) #---------------------------------------------------------------------- diff --git a/demo/StyledTextCtrl_1.py b/demo/StyledTextCtrl_1.py index 37f0ecdf..759ad02f 100644 --- a/demo/StyledTextCtrl_1.py +++ b/demo/StyledTextCtrl_1.py @@ -1,15 +1,7 @@ -#!/usr/bin/env python - -# 11/21/2003 - Jeff Grimmett (grimmtooth@softhome.net) -# -# o wx.TheClipboard.Flush() generates a warning on program exit. - import wx import wx.stc as stc -import images - #---------------------------------------------------------------------- debug = 1 @@ -171,43 +163,20 @@ def runTest(frame, nb, log): p.SetAutoLayout(True) - #ed.SetBufferedDraw(False) - #ed.StyleClearAll() - #ed.SetScrollWidth(800) - #ed.SetWrapMode(True) - #ed.SetUseAntiAliasing(False) - #ed.SetViewEOL(True) - - #ed.CmdKeyClear(stc.STC_KEY_BACK, - # stc.STC_SCMOD_CTRL) - #ed.CmdKeyAssign(stc.STC_KEY_BACK, - # stc.STC_SCMOD_CTRL, - # stc.STC_CMD_DELWORDLEFT) - ed.SetText(demoText) - # if wx.USE_UNICODE: import codecs decode = codecs.lookup("utf-8")[1] ed.GotoPos(ed.GetLength()) ed.AddText("\n\nwx.StyledTextCtrl can also do Unicode:\n") uniline = ed.GetCurrentLine() - unitext, l = decode('\xd0\x9f\xd0\xb8\xd1\x82\xd0\xbe\xd0\xbd - ' - '\xd0\xbb\xd1\x83\xd1\x87\xd1\x88\xd0\xb8\xd0\xb9 ' - '\xd1\x8f\xd0\xb7\xd1\x8b\xd0\xba \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb3\xd1\x80\xd0\xb0\xd0\xbc\xd0\xbc\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x8f!\n\n') + unitext, l = decode(b'\xd0\x9f\xd0\xb8\xd1\x82\xd0\xbe\xd0\xbd - ' + + b'\xd0\xbb\xd1\x83\xd1\x87\xd1\x88\xd0\xb8\xd0\xb9 ' + + b'\xd1\x8f\xd0\xb7\xd1\x8b\xd0\xba \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb3\xd1\x80\xd0\xb0\xd0\xbc\xd0\xbc\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x8f!\n\n') ed.AddText('\tRussian: ') ed.AddText(unitext) ed.GotoPos(0) - #else: - # #ed.StyleSetFontEncoding(stc.STC_STYLE_DEFAULT, wx.FONTENCODING_KOI8) - # #text = u'\u041f\u0438\u0442\u043e\u043d - \u043b\u0443\u0447\u0448\u0438\u0439 \u044f\u0437\u044b\u043a \n\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f!' - # #text = text.encode('koi8-r') - # #ed.StyleSetFontEncoding(stc.STC_STYLE_DEFAULT, wx.FONTENCODING_BIG5) - # #text = u'Python \u662f\u6700\u597d\u7684\u7de8\u7a0b\u8a9e\u8a00\uff01' - # #text = text.encode('big5') - # ed.GotoPos(ed.GetLength()) - # ed.AddText('\n\n' + text) ed.EmptyUndoBuffer() diff --git a/demo/TablePrint.py b/demo/TablePrint.py index 2be3db08..f058962b 100644 --- a/demo/TablePrint.py +++ b/demo/TablePrint.py @@ -24,7 +24,7 @@ class TablePanel(wx.Panel): box = wx.BoxSizer(wx.VERTICAL) box.Add((20, 30)) - keys = buttonDefs.keys() + keys = list(buttonDefs.keys()) keys.sort() for k in keys: @@ -38,8 +38,8 @@ class TablePanel(wx.Panel): def OnButton(self, evt): funct = buttonDefs[evt.GetId()][0] - code = 'self.' + funct + '()' - eval(code) + funct = getattr(self, funct) + funct() def ReadData(self): test_file = "./data/testtable.txt" diff --git a/demo/Threads.py b/demo/Threads.py index 1cfe59b1..79fb6cb9 100644 --- a/demo/Threads.py +++ b/demo/Threads.py @@ -1,11 +1,9 @@ -#!/usr/bin/env python +import random +import time +from six.moves import _thread -import random -import time -import thread - -import wx -import wx.lib.newevent +import wx +import wx.lib.newevent #---------------------------------------------------------------------- @@ -23,7 +21,7 @@ class CalcBarThread: def Start(self): self.keepGoing = self.running = True - thread.start_new_thread(self.Run, ()) + _thread.start_new_thread(self.Run, ()) def Stop(self): self.keepGoing = False diff --git a/demo/TreeMixin.py b/demo/TreeMixin.py index b838ac1a..782d0ec0 100644 --- a/demo/TreeMixin.py +++ b/demo/TreeMixin.py @@ -126,31 +126,31 @@ class VirtualTreeCtrl(DemoTreeMixin, wx.TreeCtrl): pass -class VirtualTreeListCtrl(DemoTreeMixin, wx.adv.TreeListCtrl): - def __init__(self, *args, **kwargs): - kwargs['style'] = wx.TR_DEFAULT_STYLE | wx.TR_FULL_ROW_HIGHLIGHT - super(VirtualTreeListCtrl, self).__init__(*args, **kwargs) - self.AppendColumn('Column 0') - self.AppendColumn('Column 1') - for art in wx.ART_TIP, wx.ART_WARNING: - self.imageList.Add(wx.ArtProvider.GetBitmap(art, wx.ART_OTHER, - (16, 16))) - - def OnGetItemText(self, indices, column=0): - # Return a different label depending on column. - return '%s, column %d'%\ - (super(VirtualTreeListCtrl, self).OnGetItemText(indices), column) - - def OnGetItemImage(self, indices, which, column=0): - # Also change the image of the other columns when the item has - # children. - if column == 0: - return super(VirtualTreeListCtrl, self).OnGetItemImage(indices, - which) - elif self.OnGetChildrenCount(indices): - return 4 - else: - return 3 +# class VirtualTreeListCtrl(DemoTreeMixin, wx.adv.TreeListCtrl): +# def __init__(self, *args, **kwargs): +# kwargs['style'] = wx.TR_DEFAULT_STYLE | wx.TR_FULL_ROW_HIGHLIGHT +# super(VirtualTreeListCtrl, self).__init__(*args, **kwargs) +# self.AppendColumn('Column 0') +# self.AppendColumn('Column 1') +# for art in wx.ART_TIP, wx.ART_WARNING: +# self.imageList.Add(wx.ArtProvider.GetBitmap(art, wx.ART_OTHER, +# (16, 16))) +# +# def OnGetItemText(self, indices, column=0): +# # Return a different label depending on column. +# return '%s, column %d'%\ +# (super(VirtualTreeListCtrl, self).OnGetItemText(indices), column) +# +# def OnGetItemImage(self, indices, which, column=0): +# # Also change the image of the other columns when the item has +# # children. +# if column == 0: +# return super(VirtualTreeListCtrl, self).OnGetItemImage(indices, +# which) +# elif self.OnGetChildrenCount(indices): +# return 4 +# else: +# return 3 class VirtualCustomTreeCtrl(DemoTreeMixin, @@ -192,7 +192,7 @@ class TreeNotebook(wx.Notebook): super(TreeNotebook, self).__init__(*args, **kwargs) self.trees = [] for class_, title in [(VirtualTreeCtrl, 'TreeCtrl'), - (VirtualTreeListCtrl, 'TreeListCtrl'), + #(VirtualTreeListCtrl, 'TreeListCtrl'), (VirtualCustomTreeCtrl, 'CustomTreeCtrl')]: tree = class_(self, treemodel=treemodel, log=log) self.trees.append(tree) diff --git a/demo/XMLtreeview.py b/demo/XMLtreeview.py deleted file mode 100644 index 9afe79ac..00000000 --- a/demo/XMLtreeview.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env python - -import sys -import wx - -from xml.parsers import expat - -#---------------------------------------------------------------------- - -class XMLTree(wx.TreeCtrl): - def __init__(self, parent, ID): - wx.TreeCtrl.__init__(self, parent, ID) - self._root = self.AddRoot("Root") - self.nodeStack = [self._root] - - # Trees need an image list to do DnD... - self.il = wx.ImageList(16,16) - self.SetImageList(self.il) - - # event handlers for DnD - self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnBeginDrag) - self.Bind(wx.EVT_TREE_END_DRAG, self.OnEndDrag) - - - def OnBeginDrag(self, event): - item = event.GetItem() - - if item != self.GetRootItem(): - self.draggingItem = item - event.Allow() # if DnD of this item is okay Allow it. - - def IsDescendant(self, firstItem, secondItem): - "Recursive check if firstItem is a descendant of a secondItem." - if firstItem == self._root: - return False - parentItem = self.GetItemParent(firstItem) - if parentItem == secondItem: - return True - else: - return self.IsDescendant(parentItem, secondItem) - - def OnEndDrag(self, evt): - itemSrc = self.draggingItem - itemDst = evt.GetItem() - self.draggingItem = None - - if not itemDst.IsOk(): - print("Can't drag to here...") - return - - if self.IsDescendant(itemDst, itemSrc): - print("Can't move item to its descendant") - return - - # For this simple example just take the text of the source item - # and append it to the destination item. In real life you would - # possibly want to copy subtrees... - text = self.GetItemText(itemSrc) - self.AppendItem(itemDst, text) - self.Delete(itemSrc) - - - # Define a handler for start element events - def StartElement(self, name, attrs ): - name = name.encode() - - id = self.AppendItem(self.nodeStack[-1], name) - self.nodeStack.append(id) - - def EndElement(self, name ): - self.nodeStack = self.nodeStack[:-1] - - def CharacterData(self, data ): - if data.strip(): - data = data.encode() - - self.AppendItem(self.nodeStack[-1], data) - - - def LoadTree(self, filename): - # Create a parser - Parser = expat.ParserCreate() - - # Tell the parser what the start element handler is - Parser.StartElementHandler = self.StartElement - Parser.EndElementHandler = self.EndElement - Parser.CharacterDataHandler = self.CharacterData - - # Parse the XML File - ParserStatus = Parser.Parse(open(filename,'r').read(), 1) - - -def runTest(frame, nb, log): - win = XMLTree(nb, -1) - win.LoadTree("paper.xml") - return win - -#---------------------------------------------------------------------- - - - -overview = """\ -""" - - -if __name__ == '__main__': - import sys,os - import run - run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) diff --git a/demo/XmlResource.py b/demo/XmlResource.py index 8b7060e6..268b2a89 100644 --- a/demo/XmlResource.py +++ b/demo/XmlResource.py @@ -18,8 +18,10 @@ class TestPanel(wx.Panel): label = wx.StaticText(self, -1, "The lower panel was built from this XML:") label.SetFont(wx.Font(12, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)) - resourceText = open(RESFILE).read() - text = wx.TextCtrl(self, -1, resourceText, + with open(RESFILE, 'rb') as f: + resourceBytes = f.read() + + text = wx.TextCtrl(self, -1, resourceBytes, style=wx.TE_READONLY|wx.TE_MULTILINE) text.SetInsertionPoint(0) @@ -33,13 +35,14 @@ class TestPanel(wx.Panel): elif 1: # or from a Virtual FileSystem: wx.FileSystem.AddHandler(wx.MemoryFSHandler()) - wx.MemoryFSHandler().AddFile("XRC_Resources/data_file", resourceText) - res = xrc.XmlResource("memory:XRC_Resources/data_file") + wx.MemoryFSHandler.AddFile("my_XRC_data", resourceBytes) + # notice the matching filename + res = xrc.XmlResource("memory:my_XRC_data") else: - # or from a string, like this: - res = xrc.EmptyXmlResource() - res.LoadFromString(resourceText) + # or from a buffer compatible object, like this: + res = xrc.XmlResource() + res.LoadFromBuffer(resourceBytes) # Now create a panel from the resource data diff --git a/demo/XmlResourceHandler.py b/demo/XmlResourceHandler.py index cf10c439..33339195 100644 --- a/demo/XmlResourceHandler.py +++ b/demo/XmlResourceHandler.py @@ -5,7 +5,7 @@ import wx.xrc as xrc #---------------------------------------------------------------------- -resourceText = r''' +resourceText = br''' @@ -48,8 +48,7 @@ class MyCustomPanel(wx.Panel): # the different requirements are. class PreMyCustomPanel(wx.Panel): def __init__(self): - p = wx.PrePanel() - self.PostCreate(p) + wx.Panel.__init__(self) def Create(self, parent, id, pos, size, style, name): wx.Panel.Create(self, parent, id, pos, size, style, name) @@ -84,12 +83,10 @@ class MyCustomPanelXmlHandler(xrc.XmlResourceHandler): def DoCreateResource(self): # NOTE: wxWindows can be created in either a single-phase or # in a two-phase way. Single phase is what you normally do, - # and two-phase creates the instnace first, and then later + # and two-phase creates the instance first, and then later # creates the actual window when the Create method is called. - # (In wxPython the first phase is done using the wxPre* - # function, for example, wxPreFrame, wxPrePanel, etc.) # - # wxXmlResource supports either method, a premade instance can + # wxXmlResource supports either method, a pre-made instance can # be created and populated by xrc using the appropriate # LoadOn* method (such as LoadOnPanel) or xrc can create the # instance too, using the Load* method. However this makes @@ -98,7 +95,7 @@ class MyCustomPanelXmlHandler(xrc.XmlResourceHandler): # instance, then you can make the handle much simpler. I'll # show both methods below. - if 1: + if 0: # The simple method assumes that there is no existing # instance. Be sure of that with an assert. assert self.GetInstance() is None @@ -156,9 +153,9 @@ class TestPanel(wx.Panel): line = wx.StaticLine(self, -1) # Load the resource - res = xrc.EmptyXmlResource() + res = xrc.XmlResource() res.InsertHandler(MyCustomPanelXmlHandler()) - res.LoadFromString(resourceText) + res.LoadFromBuffer(resourceText) # Now create a panel from the resource data panel = res.LoadObject(self, "MyPanel", "MyCustomPanel") @@ -171,7 +168,6 @@ class TestPanel(wx.Panel): sizer.Add(panel, 1, wx.EXPAND|wx.ALL, 5) self.SetSizer(sizer) - self.SetAutoLayout(True) #---------------------------------------------------------------------- diff --git a/demo/XmlResourceSubclass.py b/demo/XmlResourceSubclass.py index 07b44b8a..3ffb043f 100644 --- a/demo/XmlResourceSubclass.py +++ b/demo/XmlResourceSubclass.py @@ -5,7 +5,7 @@ import wx.xrc as xrc #---------------------------------------------------------------------- -resourceText = r''' +resourceText = br'''