Category Archives: Programming

Big news: A book is on the way!

This blog has been a tad slow over the last year or so, mostly because I’ve been concentrating more on making music than writing code; but that all changed when I was contacted last month with an opportunity to write a book on Tkinter.  So, sometime early next summer, my first book, Python GUI Programming with Tkinter, will be available from Packt Publications.

Wait, Tkinter?  In 2018??

Yes, I know what you’re thinking; it’s either “What on earth is Tkinter?” or “Why would you do a book on it in 2018?”

For those asking the first question, Tkinter is a GUI programming library built into the Python standard library; and if that doesn’t mean anything to you, you might not be the target demographic for this book. 🙂

For those asking the second question — well, hear me out.

To start with, this book isn’t just going to be a dry Tkinter how-to; it’s fundamentally a book about writing end-user applications and choosing the right technology to solve real-world problems (particularly in the workplace).  I’ll be going through the process of dissecting a business need and building an appropriate software solution.

The simplicity and ready availability of Tkinter makes it a decent choice for teaching budding Python programmers these principles.

But as for Tkinter itself, I think it gets a bum rap from the Python community.  Sure, it’s not a glamorous, trendy library.  It doesn’t have declarative syntax, a million and one widgets for every occasion, a Javascriptesque mini-language for form automation, or a 100 Mb browser exectuable bunlded into it.  But Tkinter hardly deserves the pariah status some Python coders give it.

The three things I mainly hear about Tkinter are:

It’s ugly

Not so many years ago, Tkinter was hideous.  Aliased fonts, limited theming, and widgets that escaped from a 1990s Unix desktop made for a look that screamed LEGACY and indelibly marked Tkinter as deprecated in the minds of many Python coders.  This has changed though; fonts are now anti-aliased, and the TTK widget set provides themable, platform-appropriate widgets.  Tkinter may not give you the Material Design look or animated semitranslucent widgets, but for your standard utility, control panel, or data-drive application, it looks fine.

The widgets are too simple

Tkinter’s form widgets are a tad disappointing when you first use them.  Comboboxes and Spinboxes don’t behave like their counterparts in other toolkits.  In the book I’m going to turn this weakness into a strength, by showing you how to extend and customize these widgets to behave precisely the way our users need them to behave.

It doesn’t scale well to larger applications

I’ve read (and maybe even said?) many times that Tkinter is “fine for small apps, but doesn’t scale to big things”.  That may be true depending on your definition of “small” and “big”, but most of us aren’t building Microsoft Office.  The book is going to go through creating a moderately-sized database application that would be pretty typical of in-house software and I’ll be demonstrating techniques to make Tkinter scale.

Exciting times, folks

This is my first experience as an author, so I’m hoping it goes well.  If you have particular aspects of Tkinter you’d like to see covered, let me know!

 

 

WCGBrowser in AUR

As of tonight, WCGBrowser is available from the Arch User repository! Arch Linux users can install “wcgbrowser-git” using their favorite AUR front-end, or by downloading the PKGBUILD directly from the AUR.

Enjoy!

Meet ADMBrowser

It’s been a snowy week like Tennessee hasn’t seen in decades, so with a couple of extra down-days on my hands I decided to work on a project that’s been on my docket for some time: porting WCGBrowser to a new web-rendering engine.

WCGBrowser has been my most popular open-source project by far, and between blog posts I’ve seen and emails I’ve received, it seems to be powering kiosks and signage from New England to the Netherlands, Germany, and Australia. I’ve found it quite useful within my own organization, but it’s Achille’s heel for many years has been QtWebKit.

QtWebKit is, basically, dead, and starting to stink a little. Its performance is slow, it’s buggy with some websites, and it tends to leak memory like a seive. The Qt community has been working for the last couple year to integrate Chrome/Chromium’s Blink browser engine into Qt, and recently with the release of 5.4 this new “QtWebEngine” library is now available for me to play with on Arch Linux.

So I’ve begun porting the browser to QtWebEngine. It became immediately obvious that this was going to break a lot of things in WCGBrowser, and I’ve been wanting to change the name for a while, so I decided to fork WCGBrowser and start a new project.

I give you ADMBrowser.

Yeah, I went full ego on the name. Mostly I just want to avoid a name collision with a commercial browser, since there is a new one being bankrolled by VC every five minutes.

ADMBrowser

So far ADMBrowser is a quick-n-dirty port of WCGBrowser to QtWebEngine, basically discarding any features that couldn’t be easily ported with a search-and-replace. Sadly, that’s a lot of important features so far:

  • Plugin support
  • External File (PDF, etc) support
  • Privacy mode
  • Proxy support
  • Certificate handling

That’s just the quick core-features test findings. I haven’t tried all the more obscure features yet. Needless to say, don’t swap your production rig to ADMBrowser just yet.

Apart from the WebEngine move, I plan to clean up some of the redundant configuration options and maybe organize things a little better. I’ll also be dropping support for Python 2 (or at least not going far out of my way to support it).

Hopefully QtWebEngine will mature quickly, or workarounds will come to light. I can tell already that many rendering and performance bugs from the old WCGBrowser are tidied by by the new renderer.

If you’re Python & Qt coder who might be able to help me fix some of these things, please feel free to fork and submit pull requests.

Python 3.4.0!

Just noticed that Python 3.4 is released as of yesterday.  I don’t normally pay much attention to Python releases, since the language more or less has done what I needed for some time; but bringing pip into the default distribution will make Windows deployments a bit easier.   The new Pathlib module looks pretty sweet too (no more mucking about with os.path).

Good job Python team!

Omega Hymnal improvements

Since uploading Omega Hymnal to Github ten days ago, I’ve made numerous improvements.  It almost seems like it’s time to slap a version number on it and call it a release.  Here’s a rundown of the features and fixes:omegahymnal-ss-2014-1-22

  • The utility links (import/export/settings/etc) are all grouped under a “Tools” submenu
  • I removed the default DB file from the source, so if you happen to use the default settings I won’t clobber your database when you “git pull”.
  • Omega Hymnal can initialize a clean database if you don’t have one, or you can reinit your database if you want to start clean.
  • I fixed a lot of nuttiness in the auto-text-sizer on the song screen. It’s more consistent now.
  • I added the capability to manually insert pagebreaks in the lyrics using the [pagebreak] tag. This is an alternative to manually shuffling things between text boxes.

Not sure where to go next, hopefully I can convince some others to start using this and get some good ideas. I’d love to figure out a way that I can make lyrics + chord entry a lot easier and less geeky (the world apparently doesn’t share my love of markup languages), though my ideas so far either go beyond the limits of JS or just over-complicate the problem.

Introducing Omega Hymnal

I’d like to announce the availability of a new program that I’ve been writing, Omega Hymnal. Omega Hymnal is a lyrics display program for informal worship settings.

omegahymnal_ss_1.png omegahymnal_ss_2.png

(more…)

On programming, kids, and game development

As many parents of boys can tell you, the dream careers of “Fireman” and “Astronaut” have long since been supplanted by “Video game programmer” (and “Lego designer”, but that’s another article…). Pretty regularly I hear from other parents that their son has an aspiration to learn programming so that he can make video games, and my own boys are no exception. This isn’t an entirely bad thing.

Kids want to make games because they understand games, and for many of them games are the most compelling thing they do on a computer. It’s not a bad way to get started in computer programming; frankly, anything that motivates you to write code is a good way to get started in programming. If that thing is games, so be it; if it’s a loan amortization calculator, that works too. Far be it from me to discourage any aspiring programmer from coding whatever gets his or her brain ticking.

Even so, there are three morsels of food-for-thought that young people and their encouraging parents should chew on when a child sets his (or her) sights on a career in video game design.

(more…)

LIFTS: the Large Internet File Transfer System

Some time back, I wrote a little utility at work using CherryPy called EasyLIFT. The idea was to reduce the number of large files that were being sent as email attachments without having to resort to the tedium of setting up FTP accounts or a big complex CMS system.

EasyLIFT allowed users to login through their LDAP credentials, upload a file to a public-facing web server, and dispatch an email with the download location to recipients. The interface was minimal and quick to use, and was a real success at work.

Recently, I was looking for an open source project to keep my coding skills sharp, so I decided to do a clean re-implementation of the EasyLIFT idea using Flask instead of CherryPy. I dubbed the project LIFTS for “Large Internet File Transfer System”. No, we aren’t transferring “Large Internet Files”, or transferring Files over the “Large Internet”, but ILFTS is kind of goofy and not memorable, so there you have it.

The project is fairly young and not fully functional yet, but if you’re interested in pitching in or just checking it out, head on over to github and grab it from the repo: https://github.com/alandmoore/lifts.

More news to come, hopefully!

Python Code completion in Emacs — at last!

I’ve been coding Python in Emacs for years now, and for the most part it’s been a satisfactory experience. After experimenting with various python modes and utilities, I’ve had a pretty good environment that marries Emacs editing to syntax highlighting, real-time error highlighting, the ipython shell, linting tools like pylint and pep8, and various other goodies. But the one hole, the one sore spot in the whole works, was code completion. Something even idle can do out-of-the-box was simply beyond my ability to get functional in Emacs.

I’d tried just about every solution the internet could offer: PyMacs, company-mode, anything-mode, ipython completion, standard autocomplete-mode. Everything I tried either gave unacceptable results (like autocomplete-mode, which just scans the current buffer for completion information), or just flat-out didn’t work no matter how many tutorials I followed.

Here lately I’ve been trying to work a lot more on my Pythoning, so I decided to see if the state of the art has caught up with this need. Echo base, I’ve found it. Repeat: I’ve found it.

(more…)

Tkinter: not dead yet!

If you follow my posts or projects much, you know that, when it comes to GUI toolkits for Python, I’m a confirmed PyQT guy. QT is arguably the most advanced, polished, complete, and powerful GUI toolkit do-everything programming library out there, and a treat to use. But sometimes it’s overkill, and when I have to put together something quick for certain legacy OS that lack decent package management, having to load in Python and extra libraries just to get a couple text fields and a button doesn’t make sense1.

Wouldn’t it be great if there was a really simple, easy to use, lightweight graphics toolkit built right in to the standard Python libraries, so you could pop together those little one-window GUIs without loading in extra stuff? Well, hey, what’s this dusty thing over here in the corner? It looks like… Tkinter!?!??

(more…)

Next Page »