I thought others might find it useful in situations where it isn't worth the investment of using a real GUI framework.
Tested (a bit) on Python3 on Windows/Mac/Linux.
Interested in any feedback at all, or any existing projects which are similar.
I thought others might find it useful in situations where it isn't worth the investment of using a real GUI framework.
Tested (a bit) on Python3 on Windows/Mac/Linux.
Interested in any feedback at all, or any existing projects which are similar.
One similar project is https://anvil.works. It's got a pure Python front end rather than HTML/CSS/JS, with a drag-and-drop designer - kinda like a modern Delphi or VB. But the client-to-server function call interface is very similar (are you using websockets too? [edit: Yes you are!]).
It's targeted at traditional web apps, rather than desktop apps, but it has an "uplink" that lets you connect local code (eg here's me building a GUI that shows text on a Raspberry Pi: https://anvil.works/blog/uplink).
Anvil isn't for distributable desktop apps (that's not where most of the action is these days, for better or worse). But we use it for one-offs (driving local code via the Uplink) all the time.
Prototype your code in the notebook ..and then click a single button to export it as a standalone app/API.
People will pay for this !
Simple, functional cross-platform GUIs with Python and Tk is a very nice thing.
If we talking cross-platform production ready, pretty GUIs, probably Python is not the best choice or if we insist on Python, then in pair with something like Qt
For simple GUIs it's easy to use and the code is clean and extendable. There is a canvas object for arbitrary graphics or custom widgets, but without OpenGL support they look ugly and it's not performant. The existing widgets are the basic, so no high-level stuff like date-pickers.
As for the layout "language", there are 3 layout managers that CSS has only begun to reach feature parity: - "pack" which is like flexbox - "grid" which is like CSS Grid - "place" which is like absolutely positioned elements All this can be mixed and matched.
With a couple hundred lines of Python you can do a React-like and bind tightly the entire GUI state to a complex `dict` that can be serialized to JSON in a couple of lines. Don't discount Tk just yet.
Why would you want to serialize it to JSON? To send it to a server or something like that?
With the correct widget types, the business state IS the GUI state and can be treated the same. For simple GUIs, there will be no redundancies and no undefined states.
Interesting, and makes sense. Coincidentally, just today I was remembering the feature of the Palm IV or V that I used to have (also the Palm Zire later, but don't remember if the latter also had the feature), of saving app state, so that when you turn it on again, all apps would be running (or was it only single-app-at-a-time, don't remember) with their exact state preserved from when you shut it down, down to even the last characters entered in the middle of a field in a form that you were filling in, for example. Also it was an almost instant-on kind of device. And was wishing that my PC / laptop could be that way too. I had read a while ago that some work had been done on much faster booting times for Linux or other OS-based PCs. Don't know the current status of such efforts.
[0] https://github.com/wooey/Wooey [1] https://github.com/chriskiehl/Gooey
I'm personally not a fan of the "bundle a browser every time" model of Electron but you could maybe do that as well to be completely self contained.
As I mentioned in the README, I think the main use of the library is either prototyping, or internal tools for your own (or your team's) use.