wxPython 4.2.0 Released

"Rumors of my death are only slightly exaggerated"

wxPython 4.2.0 is now available at PyPI, with some additional files at Extras

New and improved in this release:

  • Yes, it's been a VERY long time since the last release. I'm not dead, just on an extended break. It took me a while to get up to speed on a new day job, and then there was a seemingly perpetual crunch-mode to get the product through a couple release cycles. I can't say that things are fully back to normal yet, but at least I now know what I'm doing. Mostly. <wink>

  • This release is built using the wxWidgets' 3.2.0 release tag.

  • Tweaked the build scripts a bit to ensure that on non-Windows platforms that the compiler and flags used by default match those used by wxWidgets, (with the flags needed by Python added on.) The compiler commands can be overridden by setting CC and CXX in the environment if needed. #1247

  • On Windows the build code that locates and sets up the environment for the MSVC compiler no longer relies on distutils code, but is now using more modern code in setuptools instead. This enables much more compiler flexibility and wxPython should now be buildable with Visual Studio versions from 2015 through 2022+.

  • Switched to SIP 6 for generating the wrapper code. Rather than a standalone executable, SIP is now a Python package that needs to be installed in the Python environment used for the build. A dependency has been added to requirements/devel.txt to help ensure that the correct version is installed. The wx.siplib module code is no longer kept in the repository, but is generated during the build.

  • Changed wx.App.InitLocale to just do locale.setlocale(locale.LC_ALL, "C") to undo what Python (3.8+ on Windows) does. This lets wxWidgets start with an uninitialized locale as it expects. #1637

  • Fixed issues related to time_t always being treated as a 32-bit value on Windows. #1910

  • Added wx.FullScreenEvent and wx.EVT_FULLSCREEN.

  • The legacy, OSX-Only wx.webkit module has been removed.

  • Fix building wxPython with Python 3.10 on Windows #2016

  • Fix PyProgress on Windows by avoiding invalid sizer flags #1985

  • Fix 'More Grid Features' in demo

  • Many of the widgets which deal with bitmaps have been changed to use a wx.BitmapBundle object instead of wx.Bitmap. This is the mechanism which wxWidgets has implemented for adapting to things like Hi-DPI displays. Essentially you can load a list of bitmaps of different sizes (but similar or scaled content) into a wx.BitmapBundle, and the widget can choose one based on the display density. Existing code should be able to continue to pass a wx.Bitmap to the widget constructor or to methods like SetBitmap, as wxPython will automatically convert from a wx.Bitmap to a wx.BitmapBundle containing the single image provided.

  • Add support for new wx.grid event, EVT_GRID_ROW_MOVE

  • Fix path issues in wx.lib.agw.multidirdialog #2120

  • Fix eventwatcher checkAll(check=False) #2139

  • Fix exception on grid labels click #1841

  • Fix a large number of Python 3.10 issues. In Python 3.10, a change was implemented where extension functions that take integer arguments will no longer silently accept non-integer arguments (e.g., floats) that can only be converted to integers with a loss of precision. Fixed most of these issues in the pure-Python classes and demos by explicitly converting the parameters to int before passing them to wxWidgets. There is loss of precision, but this was happening before (automatically) anyway as most wxWidgets DeviceContext functions operate using integers.

  • Fix PlotCanvas point label drawing on Linux

  • Fix GetPopupMenu override for wx.adv.TaskbarIcon #2067

  • Fix invisible text in lib.plot with dark theme

  • Add new button type: ShowHideToggleButton. Like a ToggleButton, but with an associated "menu", a Window or Sizer which is shown/hidden when button is toggled. Includes methods for setting active and inactive fore/background colours.

  • Fix unbinding of events in FIFO order #2027

  • Enable customization of layout of pdfviewer button panel

  • Support newer PyMuPDF versions #2205

  • IntCtrl: Change default colour to wx.NullColour so the default color will be used. #2215

  • Change PopupControl to respect all the parameters passed to its init method. #2218

  • Fixes in flatmenu.py Remove and DestroyItem #2219

  • Using the MinGW toolchain to build wxPython has been simplified a bit. #2211

wxPython 4.1.1 Released

"An attitude of gratitude"

wxPython 4.1.1 is now available at PyPI, with some additional files at Extras

New and improved in this release:

  • This should have been mentioned in the notes for the last release, but alas, it wandered away and got lost. wxWidgets is now validating the flags passed when adding items to a sizer, to ensure that they are the correct flags for the type of the sizer. If the given flags do not make sense, for example using horizontal alignment flags in a horizontal box sizer, then a wxAssertionError error is raised.

  • Fixed missing binder for EVT_STC_AUTOCOMP_SELECTION_CHANGE. #1613

  • DataViewModel.HasValue can be overridden and will inform the DataViewCtrl whether or not an item and column has data. If HasValue returns False, then GetValue for that item/col will not be called. This allows a distinction between a truly empty cell, and one that has a value even if it is an empty string. #1600

  • Added flag that allows blocking of item dragging in the UltimateListControl class. PR#1620

  • Add the column index to notification events in UltimateListControl PR#1630

  • Added orientation parameter to UltimateListControl.GetScrollPos. PR#1632

  • wx.lib.agw.aui.AuiNotebook RemovePage() now hides the removed page, so it needs to be shown again if it is reused in another place. PR#1668

  • Fixed issue that could modify bytes objects under Python. PR#1680

  • Added wx.lib.agw.aui.EVT_AUI_PANE_CLOSE event which is sent when a AUI (the agw version) Pane has been closed (after it has been closed, not when it is about to be closed, which is when EVT_AUI_PANE_CLOSE is sent.) PR#1628

  • Exposed the wx.DC methods GetGraphicsContext and SetGraphicsContext. Depending on the platform and the type of the DC, there may be a wx.GraphicsContext used for the implementation of the DC. If so, the GetGraphicsContext method enables access to it. Be sure to check that the return value is not None before trying to use it.

  • Simplified the implementation of the wx.App.InitLocale method. See the MigrationGuide for more information.

  • Added wx.lib.agw.aui.AUI_DOCKART_HINT_WINDOW_BORDER_COLOUR constant so the hint window border color can be themed as well.

  • The wx.lib.mixins.listCtrl.CheckListCtrlMixin is now obsolete because wx.ListCtrl has new functionality which does pretty much the same thing. In fact there is some overlap in method names which may trip up some use cases. It is advised to drop the use of CheckListCtrlMixin and just use the wx.ListBox functionality. You will need to call EnableCheckBoxes to turn it on, and you may need to change some event handlers or overloaded methods.

  • wx.html2.WebView is now able to use Microsoft's Edge browser component as its backend renderer. This should improve the capabilities of the WebView widget on Windows, and be more consistent with the WebViews on the other platforms, compared to the original IE 11 backend. Using this backed requires that a new-ish version of the Edge browser is installed on the end user's computer.

  • Added the wx.Image.ConvertToRegion method. This lets you create a wx.Region from an image and a specified color or the mask if the image has one. This was done to workaround a bug in wxMac, but it seems worthwhile enough to keep it around even after the bug was fixed.

  • Added the missing context manager methods for wx.LogNull. #1842

  • Refactored ScrolledThumbnail out of agw.ThumbnailCtrl so as to be usable outside of ThumbnailCtrl.

wxPython 4.1.0 Released

"Escaping the Quarantine"

wxPython 4.1.0 is now available at PyPI, with some additional files at Extras

Starting with this release wxPython has switched to tracking the wxWidgets master branch (version 3.1.x) for the wxWidgets source code, which wxPython is built upon, and which is included in the wxPython source archives.

This will be the last release to include binaries for Python 2.7. The code will likely still compile and be compatible with Python 2.7 for some time, but no effort will be put into keeping it that way.

New and improved in this release:

  • Add a sample for wx.Font.AddPrivateFont to the demo.

  • Added wrappers for the OSXEnableAutomaticQuoteSubstitution, OSXEnableAutomaticDashSubstitution, and OSXDisableAllSmartSubstitutions methods in wx.TextCtrl. Also added OSXEnableAutomaticTabbing in wx.App.

  • Added wx.ColourDialogEvent, wx.DCTextBgColourChanger, wx.DCTextBgModeChanger, wx.grid.GridCellDateRenderer, wx.grid.GridCellDateEditor, wx.SystemAppearance, etc.

  • Many of the deprecated items in wxWidgets and wxPython are being or have been removed. Be sure to test your code in a recent 4.0.x release with warnings enabled so you can see which class, method or function calls you need to change.

  • Bug fixes in wx.lib.calendar: key navigation across month boundaries is now possible; key navigation now sets the date and fires the EVT_CALENDAR event; setter APIs now set the date correctly #1230.

  • Switch to using a wx.Overlay in the Widget Inspection Tool to highlight widgets when running on a GTK3 port.

  • Fixed issue in wx.lib.agw.customtreectrl where the label editor could remain stuck forever #1235.

  • Grafted on a EnableSystemTheme method to the classes which support it. This can be used to disable the default system theme on Windows for native widgets like wx.ListCtrl, wx.TreeCtrl and wx.dataview.DataViewCtrl. It has no effect on the other platforms.

  • The wx.WS_EX_VALIDATE_RECURSIVELY extended style flag is obsolete, as it is now the default (and only) behavior. The style flag has been added back into wxPython for compatibility, but with a zero value. You can just stop using it in your code with no change in behavior. #1278

  • Fix a sometimes crash when using a wx.Overlay by letting the wx.DCOverlay hold a reference to the DC, to ensure that the DCOverlay is destroyed first. PR#1301

  • Replaced the Vagrant VMs used for building wxPython for various Linux distros with Docker images.

  • Add some missing methods in wx.adv.BitmapComboBox #1307

  • Added the wx.svg package which contains code for parsing SVG (Scalable Vector Graphics) files, and also code for integrating with wxPython. It can rasterize the SVG to a wx.Bitmap of any size with no loss of quality, and it can also render the SVG directly to a wx.GraphicsContext using the GC's drawing primitives. PR#1323

  • Ported the embedding sample from Classic, which shows how to use wxPython from a C++ wxWidgets application that embeds Python. PR#1353

  • Fixed wx.GetApp() to use wxWidgets' global wxApp instance instead of maintaining its own pointer. This way, if the wxApp is created by C++ code wxPython will still be able to get access to it. #1126

  • Added wrappers for the wx.ActivityIndicator class.

  • Added wrappers for the wx.CollapsibleHeaderCtrl class.

  • Fixed issues in PlotCanvas around displaying and using scrollbars. #1428

  • Added wx.msw.CHMHelpController, and also a wx.HelpController factory function that creates an instance of the best Help Controller for the platform. #1536

  • Added wx.adv.GenericAnimationCtrl so the generic version of the animation classes can be used even on the platforms that have a native version. Note that due to internal changes to support both types of animations, some API changes in how the Animation objects are created. See the AnimationCtrl.py sample in the demo for the various usage patterns #1579

  • Added wrappers for the wx.grid.GridBlockCoords, wx.grid.GridBlocks, and wx.grid.GridBlockDiffResult classes, as well as associated new methods in the wx.grid.Grid class. These provide a new way to interact with blocks of selected cells, including an iterator interface in wx.grid.GridBlocks which should be a more efficient (time and memory) way to process large groups of selections.

Hire a wxPython Pro!

Note

UPDATE 2: In one of the great ironies of life, just a few day after I remembered to finally update this post to let you know that I'm working again, I found out that my job would be ending due to our tiny company being acquired by a mega-company. So I'm looking for full-time work yet again. Fun fun fun.

UPDATE: Hi all, I am on the steady income train once again, however I am still interested in learning about opportunities that I may be well suited for. So send 'em if you've got 'em.

Hi all,

Once again I find myself in between full-time employment, and so, once again, I'm informing the wxPython community about it in case anybody knows of opportunities that might be a good fit for me. I'm sure you all have a good idea of my qualifications, but if you need more details please contact me directly. I'm open to direct-hire, contract, or contract-to-hire opportunities. Preferably as a remote worker.

Until the next full-time gig comes along, I'm also open to smaller, one-off wxPython-related jobs. Either some feature or fix within wxPython itself that you want to ensure shows up in a near-future release, or helping out with your own projects using wxPython.

I can be contacted about possible opportunities either by email, or via a direct message at Discuss wxPython.

Thanks!
Robin

wxPython 4.0.7.post2 Released

"To QTKit, or not to QTKit..."

wxPython 4.0.7.post2 is now available at PyPI, with some additional files at Extras

This post-release changes a wxWidgets configure option on macOS so the build will be forced to use AVFoundation instead of QTKit. This ensures that wxMediaCtrl will work on macOS 10.15+, where all support for QTKit has been removed.

wxPython 4.0.7 Released

"one more, for the road"

wxPython 4.0.7 is now available at PyPI, with some additional files at Extras

This release is comprised mostly of fixes and minor features which have been back-ported from the master branch. This release is likely the last release of the 4.0.x release series, and is certainly the last 4.0.x release that will support Python 2.7. It may still continue to build for Python 2.7 for some time, but no extra effort will be expended to keep it compatible.

This release provides the following changes:

  • Bug fixes in wx.lib.calendar: key navigation across month boundaries is now possible; key navigation now sets the date and fires the EVT_CALENDAR event; setter APIs now set the date correctly #1230.

  • Switch to using a wx.Overlay in the Widget Inspection Tool to highlight widgets when running on a GTK3 port.

  • Fixed issue in wx.lib.agw.customtreectrl where label editor could remain stuck forever #1235.

  • Fix a sometimes crash when using a wx.Overlay by letting the wx.DCOverlay hold a reference to the DC, to ensure that the DCOverlay is destroyed first. PR#1301

  • Ported the embedding sample from Classic, which shows how to use wxPython from a C++ wxWidgets application that embeds Python. PR#1353

  • Fixed wx.GetApp() to use wxWidgets' global wxApp instance instead of maintaining its own pointer. This way, if the wxApp is created by C++ code wxPython will still be able to get access to it. #1126

  • Several other PRs have been backported from the master branch (which will become wxPython 4.1.0), the full list can be seen on GitHub here.