Hacker News new | comments | show | ask | jobs | submit login
Show HN: Eel – a simple Python library for making little HTML GUI applications (github.com)
201 points by ChrisKnott 11 months ago | hide | past | web | favorite | 44 comments

I made this Python library for my own needs because I wanted to make some very simple (30 line) GUI applications using HTML/JS for the frontend.

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.

This is neat!

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).

This is just one step away from being a better Jupyter.

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 !

cool except it's not self-hostable/oss. why would you use a hosted frontend for a local app?

It actually is self hostable (that's how quite a few of our customers use it), but no, it's not OSS (because we needed to build a sustainable business).

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.

from their perspective, to charge people, I guess

Anvil has been on my to-check-out list for a while, I think it's really impressive what you guys have done.

I do not want to sound in a bad way, though if you need to create very simple GUIs with Python, what's wrong with Tk?

I'm out of the loop, but I have never seen a Tk interface that didn't look straight out of 1997. Also, many people are "fluent" in HTML/javascript/python, but aren't so familiar with Tk.

Themed TK uses native widgets and it presents the same basic API. It's distributed by default too, it's not an external library. You can use both the old and the new widgets in the same GUI.

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.

>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?

Mostly for persistence. Save it into a file, restart the program and load the entire state losslessly. You can also send it to a server or do whatever you want.

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.

>Mostly for persistence. Save it into a file, restart the program and load the entire state losslessly.

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.

Also, there are a lot of great libraries (e.g., for visualizations) in JS that this would allow you to use.

Yes, I know that, though if I'd want a simple GUI in few lines of python probably it's something not client facing and internal use only, thus design aspect is not bothering me.

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

Right. HTML seems like a lot for a small app. I have had some success with AppJar. It might not be the fastest but its super intuitive and easy... http://appjar.info

Personally it was because I wanted to use some widgets from jQueryUI, but mostly people are just lazy and they happen to know HTML/CSS/JS already

It looks great. I have been using bottle for simple web application. While there appears to be overlap between the too this looks excellent way to built good quality client apps using browser UI but without the 'ajax-tax' of Electron and its ilk. Looking forward to trying this on some local client apps i have to do in next couple of days.

Could you create a web accessable version of this where you give someone a link and they would have the same access? I like this because I really don't like dropping into javascript in a codebase that already has a bunch of python code.

You may want to check out a project called Wooey. It's a drop-in-and-go frontend for your scripts kind of like Gooey[1], but web rather than native focused.

[0] https://github.com/wooey/Wooey [1] https://github.com/chriskiehl/Gooey

I don't see it mentioned in the README, but is this something I can package into a distributable package?

I'm not sure to be honest, I think it would probably work - you could just bundle all the dependencies (apart from the browser) using 'pip download eel' - that seems to be about 750KB of stuff.

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.

toga - sort of.

A similar project, but for C/C++/Go (using gtk-webkit, cocoa-webkit and mshtml):


Does not require a web server (uses JS-to-native bindings instead), which might be a benefit.

An older PoC that someone did in Go very similar to how this project fires up an already-installed browser: https://github.com/utamaro/neje-ui

Shameless plug! I have a similar Python project but focused on building native applications without actually writing a single line of UI code. I call it Gooey[1]! It was front page on HN a few years ago ^_^

The next version is currently in RC1 and brings support for in-UI validation/error messages, better layout customization[2], new widget types, and more!

I'm trying to recruit a few more people to test the current release branch[3] :)

[1] https://github.com/chriskiehl/Gooey. [2] https://user-images.githubusercontent.com/1408720/34464824-c... [3] https://github.com/chriskiehl/Gooey/tree/rc1

Neat! It would be cool to port this to one of the node option-parsing libraries, perhaps launching a small Electron-ish webapp for the "gooey."

My ultimate goal is to get rid of the need for language specific ports -- one front-end to rule them all! :)

The whole thing is currently powered by plain ol' json. The next step on my list is (optionally) shipping an executable that any language can feed the appropriate JSON to in order to get their GUI side for 'free'.

For my similar purposes I made this:


It's a declarative way to do simple Tk GUIs. Also, Tk does not have to look like 1997, it's themable and it can also use the native widget library on Windows and OS X.

The tk native widgets don’t look good, because they don’t follow the OS’s user interface conventions. The most notable issue is that widgets don’t have the correct padding or font, even if they’re being rendered via Cocoa (for example).

The example layout here [0] may be functional, and rendered by the platform, but it does not look “native” because the text areas are shoved right up against each other.

[0] https://user-images.githubusercontent.com/6771275/28181423-d...

Last time I used Tk was with TCL and yes, it was all Motif (or notif or whatever).

I should probably take a look at it again if it can now do native components. I'm really sick of these bloated new desktop frameworks like Electron.

I found Remi https://github.com/dddomodossola/remi to be excellent for creating HTML frontends to python apps

Thanks for pointing out remi which i just gave a test-drive. Also very nice!

Great to see efforts like this trying to move the needle on the designer usability of “native” UI toolkits for Python/Go/Ruby/etc.

Any ideas for other ways designers can help improve/influence the UX of “native” toolkits?

It seems like native UI development (especially for PC or Linux embedded device displays) is stuck years behind the simplicity of layout for the web. And I’m not aware of anyone but Apple doing constraint-based layout (as with Interface Builder). With platforms like Raspberry Pi and BeagleBone increasing the accessibility of embedded Linux design it seems like there’s a need for designer-friendly UI toolkits that don’t require tons of dependencies or the complexity of running a web stack to render a UI, but do require responsiveness across devices and operating systems.

Qt is a great choice for embedded Linux UIs.

Remi (https://github.com/dddomodossola/remi) is also similar and is shipping in a few commercial products and a few popular raspberry pi apps

Wow, that’s pretty cool! I can think of some interesting uses for this!

I had built a similar one using WebKit + Gtk.. Did not actually know about `--app` option to Chrome. This would have been a good fallback option when Gtk + WebKit is not available..


What's the performance like, compared to Electron?

Runtime performance will obviously vary across platforms, but in all cases, at least the executable will be much, much smaller! :)

curious why you didn't choose asyncio? If I understand this correctly, it lets you write python endpoints to call from javascript? Does it let you create UI from python only?

Lot of questions because I'd like to see more Python use in front-end/electron type of projects.

You do not understand this correctly:

> [Asyncio] provides infrastructure for writing single-threaded concurrent code using coroutines, multiplexing I/O access over sockets and other resources, running network clients and servers, and other related primitives.

I still don't, what does that mean exactly?

> If I understand this correctly, it lets you write python endpoints to call from javascript? Does it let you create UI from python only?

It does not let you write endpoints.

It does not let you make UIs.

All asyncio does it to let you run python code asynchronously.

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact