What is this?
It's a GUI framework prioritizing portability, simplicity, and a Pythonic feel. The two facts I think will best hook you:
Simple GUIs are simple to make:
You could type
easy_install browsergui && python -m browsergui.examplesthis instant, and it would work. (Well, maybe you need to
sudo.) There's no complex application framework you need to install first.
(Corollary: if you build a GUI using this package, your co-developers/users also won't need to install anything complicated.)
If you want to build a simple GUI for a simple task, this is a great library. Here's a mock-up that shows all the stuff you can do with it.
If you want to build a video game, or a nice, fluid 3D visualization, this is easily the worst GUI framework I have ever seen.
- Why is it good?
- Why is it bad?
- What are the alternatives?
- How do I install it?
- How do I learn to use it?
Why is it good?
This package prioritizes ease of use, portability, and good documentation above all else. The following statements will remain true as long as I have breath left in my body:
- It feels like Python. It uses HTML/CSS/JS under the hood, but that fact is carefully hidden under nice object-oriented abstractions. Contrast with Tkinter, which feels like Tk, because it is.
- It has a shallow learning curve. "Hello World" is
GUI(Text("Hello world!")).run(). Minesweeper, including the game logic, is less than 100 lines of code and looks like this.
- It's super-portable.
pip install browsergui && python -m browsergui.exampleshas worked, with no snags, on every system I've tried (OS X, Debian, and Ubuntu, with both Python 2.7 and a few Python 3.Xs). Seriously, you could run that right now and it would work, without a single abstruse error message about your Qt/wx/PyObjC installation. At the risk of tooting my own horn, I've never seen another GUI library so easy to install.
- It's well-documented. There's a wiki to teach you how to use it. There are examples. There's a reference manual. There's a runnable demo for every predefined kind of element. I've spent more time documenting than I've spent writing actual code.
Why is it bad?
- It's slow. It does not even try to be high-performance. There's an HTTP request every time the user interacts with the GUI, and again every time the view is updated. Performance is off the table. (It's not frustratingly slow -- you can drag a slider and see the value update with no perceptible delay -- but it's not good for fancy stuff.)
- It's not super-easy to make super-pretty things. I just haven't prioritized styling: any styling you want to do, you have to do through CSS. I'm not sure
element.css['color'] = 'red'is so much worse than
widget.config(foreground="#f00"), but it does feel like a thin wrapper over CSS (because it is), which is gross.
- Its input-handling is limited. Full-powered GUI libraries let you capture every mouse movement, every keypress, anything you can dream. That might come to Browsergui eventually, but for now, you're pretty much limited to predefined input fields.
- It doesn't provide utility functions. Every other GUI framework I can recall seeing provides things like timers: things that are nice to have when you're making a GUI, but aren't directly related to user-interaction. This package doesn't offer those and probably never will. If you want timers, get them from a different package.
What are the alternatives?
I am aware of some GUI toolkits for Python that fill a similar niche. You should consider using these instead:
RemI, which has exactly the same idea (build a GUI in Python, run it in a browser). Definitely worth a look.
Advantages: (at the time of writing) has more features, e.g. file-input dialogs. Looks significantly prettier.
Disadvantages: (at the time of writing) less thorough tutorials/documentation. Simple apps are more verbose.
tkinter (standard library)
Advantages: it's well-known. Lots of people have written tutorials and documentation for it.
Disadvantages: it feels like a wrapper around Tk, because it is. This gives good performance and detailed control, but writing it feels unintuitive (to me). Also, I've had trouble getting it to work with multiple Python installations.
Advantages: pyJS applications are much faster and much easier to deploy (since it doesn't require the user to run Python).
Disadvantages: I had trouble installing it. And like
tkinter, it's a wrapper, with the same dis/advantages.
How do I install it?
If you use pip,
pip install browsergui.
If you use easy_install,
If you don't like package managers, just unzip this and put the
browsergui folder anywhere on your Python path.
Once it's installed, I recommend running
python -m browsergui.examples to see a catalog of all the kinds of building blocks available to you, or checking out the wiki for tutorial-type stuff.
How do I learn to use it?
The wiki has several tutorial-type pages. Or you could just extrapolate from these examples:
from browsergui import GUI, Text GUI(Text("Hello world!")).run()
A number that increments every time you press a button:
from browsergui import GUI, Text, Button button = Button('0') @button.def_callback def increment(): button.text = str(int(button.text)+1) GUI(button).run()
import time import threading from browsergui import Text, GUI now = Text("") def update_now_forever(): while True: now.text = time.strftime("%Y-%m-%d %H:%M:%S") time.sleep(1) t = threading.Thread(target=update_now_forever) t.daemon = True t.start() GUI(Text("The time is: "), now).run()
(You can close/reopen the browser window at any time; Ctrl-C will stop the server.)
Each kind of element (
Grid...) also has a simple example showing you how to use it:
python -m browsergui.examples will display all those examples to you.