The wxPython toolkit added context managers to its code base a few years ago, but for some reason you don’t see very many examples of their use. In this article, we’ll look at three examples of context managers in wxPython. A wxPython user was the first person to suggest using context managers in wxPython on the wxPython mailing list. We’ll start off by rolling our own context manager and then look at a couple of examples of built-in context managers in wxPython.
The other day, I came across an interesting StackOverflow question where the fellow was trying to figure out how to open a sub-frame only once. Basically he wanted a single instance of the sub-frame (and other sub-frames). After digging around a bit on Google, I found an old thread from the wxPython Google Group that had an interesting approach to doing what was needed.
Basically it required a bit of meta-programming, but it was a fun little exercise that I thought my readers would find interesting. Here’s the code:
I recently came across a StackOverflow question where the fellow was asking how to get wxPython’s RichTextCtrl’s XML data so he could save it to a database. I don’t know much about this control, but after a quick Google search, I found an article from 2008 that gave me the information I needed. I took that example and cut it down to the following example:
In this tutorial, we’ll look at three simple ways to create a wxPython frame. If you’re a visual learner, I also created a screencast version of this article that you can view below:
I see this come up from time to time where people will ask how to center a widget in a window. The solution is actually quite easy. In most cases, you just need to nest a Horizontal BoxSizer inside of a Verticel BoxSizer with some spacers. In this article, I’ll show you
two three different ways to accomplish this task.
The wxPython library comes with a pair of handy methods called Freeze() and Thaw(). The call to Freeze() prevents the window from updating while it is frozen. This can be useful when you are adding or removing widgets and you want to reduce your UI from appearing to flicker. After you finish updating the UI, then you call the Thaw() method so that the user will be able to see the update.
Let’s take a look at a simple example.
The wxPython GUI toolkit includes its own date / time capabilities. Most of the time, you can just use Python’s datetime and time modules and you’ll be fine. But occasionally you’ll find yourself needing to convert from wxPython’s wx.DateTime objects to Python’s datetime objects. You may encounter this when you use the wx.DatePickerCtrl widget.
Fortunately, wxPython’s calendar module has some helper functions that can help you convert datetime objects back and forth between wxPython and Python. Let’s take a look:
def _pydate2wxdate(date): import datetime assert isinstance(date, (datetime.datetime, datetime.date)) tt = date.timetuple() dmy = (tt, tt-1, tt) return wx.DateTimeFromDMY(*dmy) def _wxdate2pydate(date): import datetime assert isinstance(date, wx.DateTime) if date.IsValid(): ymd = map(int, date.FormatISODate().split('-')) return datetime.date(*ymd) else: return None
You can use these handy functions in your own code to help with your conversions. I would probably put these into a controller or utilities script. I would also rewrite it slightly so I wouldn’t import Python’s datetime module inside the functions. Here’s an example:
import datetime import wx def pydate2wxdate(date): assert isinstance(date, (datetime.datetime, datetime.date)) tt = date.timetuple() dmy = (tt, tt-1, tt) return wx.DateTimeFromDMY(*dmy) def wxdate2pydate(date): assert isinstance(date, wx.DateTime) if date.IsValid(): ymd = map(int, date.FormatISODate().split('-')) return datetime.date(*ymd) else: return None
You can read more about this topic on this old wxPython mailing thread. Have fun and happy coding!
I’ve been using wxPython for quite a while now and I see certain questions come up on a fairly frequent basis. One of the popular ones is how to ask the user for their credentials before loading up the rest of the application. There are several approaches to this, but I am going to focus on a simple solution as I believe this solution can be used as the basis for more complex solutions.
Basically what we want to happen is for the user to see a login dialog where they have to enter their username and password. If they enter it correctly, then the program will continue to load and they’ll see the main interface. You see this a lot on websites with a common use case being web email clients. Desktop applications don’t include this functionality as often, although you will see it for Stamps.com’s application and for law enforcement software. We will be creating a dialog that looks like this:
The wxPython Google Group was discussing different methods of catching exceptions in wxPython the other day. If you use wxPython a lot, you will soon realize that some exceptions are difficult to catch. The wxPython Wiki explains why. Anyway, the fellows on the list were recommending the use of sys.excepthook. So I took one of the methods they mentioned and created a little example: Continue reading wxPython: Catching Exceptions from Anywhere
The other day someone was asking a lot of questions on StackOverflow about how to work with wizards in wxPython. You can read the two original questions here and here. The code we’ll be looking at in this example is what I used to answer the questions on Stack. The primary question was how to disable the Next in a wxPython wizard. Continue reading wxPython: How to Disable a Wizard’s Next Button