A little Python library for making simple Electron-like HTML/JS GUI apps

Related tags

GUI Development Eel
Overview

Eel

PyPI version PyPi Downloads Python License

Total alerts Language grade: JavaScript Language grade: Python

Eel is a little Python library for making simple Electron-like offline HTML/JS GUI apps, with full access to Python capabilities and libraries.

Eel hosts a local webserver, then lets you annotate functions in Python so that they can be called from Javascript, and vice versa.

Eel is designed to take the hassle out of writing short and simple GUI applications. If you are familiar with Python and web development, probably just jump to this example which picks random file names out of the given folder (something that is impossible from a browser).

Intro

There are several options for making GUI apps in Python, but if you want to use HTML/JS (in order to use jQueryUI or Bootstrap, for example) then you generally have to write a lot of boilerplate code to communicate from the Client (Javascript) side to the Server (Python) side.

The closest Python equivalent to Electron (to my knowledge) is cefpython. It is a bit heavy weight for what I wanted.

Eel is not as fully-fledged as Electron or cefpython - it is probably not suitable for making full blown applications like Atom - but it is very suitable for making the GUI equivalent of little utility scripts that you use internally in your team.

For some reason many of the best-in-class number crunching and maths libraries are in Python (Tensorflow, Numpy, Scipy etc) but many of the best visualization libraries are in Javascript (D3, THREE.js etc). Hopefully Eel makes it easy to combine these into simple utility apps for assisting your development.

Join Eel's users and maintainers on Discord, if you like.

Install

Install from pypi with pip:

pip install eel

To include support for HTML templating, currently using Jinja2:

pip install eel[jinja2]

Usage

Directory Structure

An Eel application will be split into a frontend consisting of various web-technology files (.html, .js, .css) and a backend consisting of various Python scripts.

All the frontend files should be put in a single directory (they can be further divided into folders inside this if necessary).

my_python_script.py     <-- Python scripts
other_python_module.py
static_web_folder/      <-- Web folder
  main_page.html
  css/
    style.css
  img/
    logo.png

Starting the app

Suppose you put all the frontend files in a directory called web, including your start page main.html, then the app is started like this;

import eel
eel.init('web')
eel.start('main.html')

This will start a webserver on the default settings (http://localhost:8000) and open a browser to http://localhost:8000/main.html.

If Chrome or Chromium is installed then by default it will open in that in App Mode (with the --app cmdline flag), regardless of what the OS's default browser is set to (it is possible to override this behaviour).

App options

Additional options can be passed to eel.start() as keyword arguments.

Some of the options include the mode the app is in (e.g. 'chrome'), the port the app runs on, the host name of the app, and adding additional command line flags.

As of Eel v0.12.0, the following options are available to start():

  • mode, a string specifying what browser to use (e.g. 'chrome', 'electron', 'edge', 'custom'). Can also be None or False to not open a window. Default: 'chrome'
  • host, a string specifying what hostname to use for the Bottle server. Default: 'localhost')
  • port, an int specifying what port to use for the Bottle server. Use 0 for port to be picked automatically. Default: 8000.
  • block, a bool saying whether or not the call to start() should block the calling thread. Default: True
  • jinja_templates, a string specifying a folder to use for Jinja2 templates, e.g. my_templates. Default: None
  • cmdline_args, a list of strings to pass to the command to start the browser. For example, we might add extra flags for Chrome; eel.start('main.html', mode='chrome-app', port=8080, cmdline_args=['--start-fullscreen', '--browser-startup-dialog']). Default: []
  • size, a tuple of ints specifying the (width, height) of the main window in pixels Default: None
  • position, a tuple of ints specifying the (left, top) of the main window in pixels Default: None
  • geometry, a dictionary specifying the size and position for all windows. The keys should be the relative path of the page, and the values should be a dictionary of the form {'size': (200, 100), 'position': (300, 50)}. Default: {}
  • close_callback, a lambda or function that is called when a websocket to a window closes (i.e. when the user closes the window). It should take two arguments; a string which is the relative path of the page that just closed, and a list of other websockets that are still open. Default: None
  • app, an instance of Bottle which will be used rather than creating a fresh one. This can be used to install middleware on the instance before starting eel, e.g. for session management, authentication, etc.

Exposing functions

In addition to the files in the frontend folder, a Javascript library will be served at /eel.js. You should include this in any pages:

<script type="text/javascript" src="/eel.js"></script>

Including this library creates an eel object which can be used to communicate with the Python side.

Any functions in the Python code which are decorated with @eel.expose like this...

@eel.expose
def my_python_function(a, b):
    print(a, b, a + b)

...will appear as methods on the eel object on the Javascript side, like this...

console.log("Calling Python...");
eel.my_python_function(1, 2); // This calls the Python function that was decorated

Similarly, any Javascript functions which are exposed like this...

eel.expose(my_javascript_function);
function my_javascript_function(a, b, c, d) {
  if (a < b) {
    console.log(c * d);
  }
}

can be called from the Python side like this...

print('Calling Javascript...')
eel.my_javascript_function(1, 2, 3, 4)  # This calls the Javascript function

The exposed name can also be overridden by passing in a second argument. If your app minifies JavaScript during builds, this may be necessary to ensure that functions can be resolved on the Python side:

eel.expose(someFunction, "my_javascript_function");

When passing complex objects as arguments, bear in mind that internally they are converted to JSON and sent down a websocket (a process that potentially loses information).

Eello, World!

See full example in: examples/01 - hello_world

Putting this together into a Hello, World! example, we have a short HTML page, web/hello.html:

<!DOCTYPE html>
<html>
  <head>
    <title>Hello, World!</title>

    <!-- Include eel.js - note this file doesn't exist in the 'web' directory -->
    <script type="text/javascript" src="/eel.js"></script>
    <script type="text/javascript">
      eel.expose(say_hello_js); // Expose this function to Python
      function say_hello_js(x) {
        console.log("Hello from " + x);
      }

      say_hello_js("Javascript World!");
      eel.say_hello_py("Javascript World!"); // Call a Python function
    </script>
  </head>

  <body>
    Hello, World!
  </body>
</html>

and a short Python script hello.py:

import eel

# Set web files folder and optionally specify which file types to check for eel.expose()
#   *Default allowed_extensions are: ['.js', '.html', '.txt', '.htm', '.xhtml']
eel.init('web', allowed_extensions=['.js', '.html'])

@eel.expose                         # Expose this function to Javascript
def say_hello_py(x):
    print('Hello from %s' % x)

say_hello_py('Python World!')
eel.say_hello_js('Python World!')   # Call a Javascript function

eel.start('hello.html')             # Start (this blocks and enters loop)

If we run the Python script (python hello.py), then a browser window will open displaying hello.html, and we will see...

Hello from Python World!
Hello from Javascript World!

...in the terminal, and...

Hello from Javascript World!
Hello from Python World!

...in the browser console (press F12 to open).

You will notice that in the Python code, the Javascript function is called before the browser window is even started - any early calls like this are queued up and then sent once the websocket has been established.

Return values

While we want to think of our code as comprising a single application, the Python interpreter and the browser window run in separate processes. This can make communicating back and forth between them a bit of a mess, especially if we always had to explicitly send values from one side to the other.

Eel supports two ways of retrieving return values from the other side of the app, which helps keep the code concise.

To prevent hanging forever on the Python side, a timeout has been put in place for trying to retrieve values from the JavaScript side, which defaults to 10000 milliseconds (10 seconds). This can be changed with the _js_result_timeout parameter to eel.init. There is no corresponding timeout on the JavaScript side.

Callbacks

When you call an exposed function, you can immediately pass a callback function afterwards. This callback will automatically be called asynchrounously with the return value when the function has finished executing on the other side.

For example, if we have the following function defined and exposed in Javascript:

eel.expose(js_random);
function js_random() {
  return Math.random();
}

Then in Python we can retrieve random values from the Javascript side like so:

def print_num(n):
    print('Got this from Javascript:', n)

# Call Javascript function, and pass explicit callback function
eel.js_random()(print_num)

# Do the same with an inline lambda as callback
eel.js_random()(lambda n: print('Got this from Javascript:', n))

(It works exactly the same the other way around).

Synchronous returns

In most situations, the calls to the other side are to quickly retrieve some piece of data, such as the state of a widget or contents of an input field. In these cases it is more convenient to just synchronously wait a few milliseconds then continue with your code, rather than breaking the whole thing up into callbacks.

To synchronously retrieve the return value, simply pass nothing to the second set of brackets. So in Python we would write:

n = eel.js_random()()  # This immediately returns the value
print('Got this from Javascript:', n)

You can only perform synchronous returns after the browser window has started (after calling eel.start()), otherwise obviously the call with hang.

In Javascript, the language doesn't allow us to block while we wait for a callback, except by using await from inside an async function. So the equivalent code from the Javascript side would be:

async function run() {
  // Inside a function marked 'async' we can use the 'await' keyword.

  let n = await eel.py_random()(); // Must prefix call with 'await', otherwise it's the same syntax
  console.log("Got this from Python: " + n);
}

run();

Asynchronous Python

Eel is built on Bottle and Gevent, which provide an asynchronous event loop similar to Javascript. A lot of Python's standard library implicitly assumes there is a single execution thread - to deal with this, Gevent can "monkey patch" many of the standard modules such as time. This monkey patching is done automatically when you call import eel. If you need monkey patching you should import gevent.monkey and call gevent.monkey.patch_all() before you import eel. Monkey patching can interfere with things like debuggers so should be avoided unless necessary.

For most cases you should be fine by avoiding using time.sleep() and instead using the versions provided by gevent. For convenience, the two most commonly needed gevent methods, sleep() and spawn() are provided directly from Eel (to save importing time and/or gevent as well).

In this example...

import eel
eel.init('web')

def my_other_thread():
    while True:
        print("I'm a thread")
        eel.sleep(1.0)                  # Use eel.sleep(), not time.sleep()

eel.spawn(my_other_thread)

eel.start('main.html', block=False)     # Don't block on this call

while True:
    print("I'm a main loop")
    eel.sleep(1.0)                      # Use eel.sleep(), not time.sleep()

...we would then have three "threads" (greenlets) running;

  1. Eel's internal thread for serving the web folder
  2. The my_other_thread method, repeatedly printing "I'm a thread"
  3. The main Python thread, which would be stuck in the final while loop, repeatedly printing "I'm a main loop"

Building distributable binary with PyInstaller

If you want to package your app into a program that can be run on a computer without a Python interpreter installed, you should use PyInstaller.

  1. Configure a virtualenv with desired Python version and minimum necessary Python packages
  2. Install PyInstaller pip install PyInstaller
  3. In your app's folder, run python -m eel [your_main_script] [your_web_folder] (for example, you might run python -m eel hello.py web)
  4. This will create a new folder dist/
  5. Valid PyInstaller flags can be passed through, such as excluding modules with the flag: --exclude module_name. For example, you might run python -m eel file_access.py web --exclude win32com --exclude numpy --exclude cryptography
  6. When happy that your app is working correctly, add --onefile --noconsole flags to build a single executable file

Consult the documentation for PyInstaller for more options.

Microsoft Edge

For Windows 10 users, Microsoft Edge (eel.start(.., mode='edge')) is installed by default and a useful fallback if a preferred browser is not installed. See the examples:

Comments
  • eel.init takes 20seconds

    eel.init takes 20seconds

    Describe the problem In Raspbian Stretch, Python 3.5 is the highest supported version. But for eel Python 3.6 is required. So, I looking at tutorials I compiled Python 3.6 for Raspbian Stretch and got eel working but the line "eel.init" is taking 20 seconds.

    How can I debug this issue?

    Desktop (please complete the following information):

    • OS: Raspbian Stretch
    • Browser Chromium
    help wanted 
    opened by shrsulav 22
  • Create-React-App

    Create-React-App

    Does anyone know how to get this working with Create-React-App ? I've been struggling all day and I am still nowhere forward :(

    It works if I build the CRA itself BUT I have to keep doing this every time I change something. Create-REact-App comes with it's own Dev server that hot reloads and I wanted to be able to plug into it but when I do a console.log(eel) it always prints undefined.

    opened by AnthoniG 22
  • Compile to Exe not working

    Compile to Exe not working

    Eel version Please state the version of Eel you're using. 0.11.0

    Describe the bug When I compile my Scipt to an Exe, I am getting an Error: "eel.js not found" I am getting the error when I am trying to launch the Exe/packaged app I am packing via auto-py-to-exe (master) (pyinstaller) blabla

    Imports in Python Script import typing, datetime, discord, os, time, eel from discord.ext import commands, tasks from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.keys import Keys

    OS OS: Windows Python ver: 3.7.8

    help wanted 
    opened by asdat3 18
  • Error: 404 Not Found

    Error: 404 Not Found

    Hey ya, I know this issue has probably been dealt with before, however I can't find any proper workarounds to it.

    I am getting this message: `Error: 404 Not Found Sorry, the requested URL 'http://localhost:8000/main.html' caused an error:

    File does not exist.`

    Everytime I run a test eel project. First I had issues with Python displaying a osError because some other program was using port 8000. After I killed that task to leave that port free for eel, it only showed me the message you can see above.

    Here's the code:

    eeltest.py `import eel

    eel.init('web') eel.start('main.html')`

    main.html <p>Hola</p>

    Any help will be very appreciated in advance.

    opened by mvincenzi96 18
  • Vue.js with Eel

    Vue.js with Eel

    Describe the problem I'm trying to create an app using Vue.js as fronted with Eel. However after following some other issues here on github I'm stuck with the following error: error 'eel' is not defined no-undef

    I put the Eel.js as src in my index.html file:

    <script type='text/javascript' src='http://localhost:8080/eel.js'></script>

    Here is main.py eel file:

    import eel
    import threading
    import sampling
    from subprocess import call
    from time import sleep
    
    
    def start_web():
        call(['./start.sh'])
    
    
    def start_eel():
        sleep(7)
        eel.init('VueApp', allowed_extensions=['.js', '.html', '.vue'])
        eel.start('', options={
            'port': 8080,
            'host': 'localhost',
        })
    
    
    if __name__ == '__main__':
        t1 = threading.Thread(target=start_web)
        t2 = threading.Thread(target=start_eel)
        t1.start()
        t2.start()
    

    So Im running the app in dev mode, as sugested in another issue here.

    Here is my start.sh file:

    cd VueApp
    npm run dev
    

    The thing is I'm stuck what else I should do. Is there a place I should somehow import Eel into Vue that I'm missing? My Vue app is running on port 8686 because if I set it to run on same port I get OSError in eel, not sure if that is correct.

    I think you guys managed to get this work, could you please share what should I do to make Vue recognize eel? @hiancdtrsnm @alexwohlbruck @ahopkins

    help wanted 
    opened by datainvestor 16
  • No module named 'bottle-websocket' when running an executable made with PyInstaller, including Eel module

    No module named 'bottle-websocket' when running an executable made with PyInstaller, including Eel module

    I Made a simple program, tried to make an executable out of it via PyInstaller. No errors whatsoever, but when running this executable it crashes on the first line - import eel, telling - there is no module called 'bottle-websocket'.

    I checked pip: eel, bottle-websocket are installed. Can't figure out what's the problem. Runs perfectly as a raw python file, but when executed throws this weird error. Attachments:

    main.py:

    import eel
    import sys
    
    def getcurrentdir():
        a = sys.argv[0].split("\\")
        currentdir = ''
        for i in range(len(a) - 1):
            currentdir += a[i] + "\\"
        return currentdir
    
    eel.init(getcurrentdir + "\\web")
    eel.start('main.html', block=False)
    while True:
       eel.sleep(10)
    

    Error: CMD error

    I found this in PyInstaller Warning file:

    bottle.ext' MissingModule
    imported by: eel
    

    PyInstaller's Log

    opened by MishaTreedye 16
  • Change / refresh / close page?

    Change / refresh / close page?

    Hi! Thank you a lot for your work on Eel. I'm wondering if there is a way to open, re-open, or refresh the html page in the very same window? Unfortunately, I couldn't find this information.

    I'm using Jinja2 templates for different views. As the program runs, the rendered templates are saved under the same name (index.html) and then should to be re-opened. However, doing ee.start("index.html") for the second time opens a new window beside the previous one. To add to this, the following OSError appears in the process:

    OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted: ('localhost', 8000)
    2018-05-22T20:00:29Z <Greenlet "Greenlet-0" at 0x1ece5058a48: _process_message({'call': 1.5296098246811638, 'name': 'select_new_t, <geventwebsocket.websocket.WebSocket object at 0x0)> failed with OSError
    

    but actually does not seem to affect the program's functionality.

    In case if opening another html page in the same window or refreshing it is not possible, is there a way to simply close the old window?

    opened by khoidt 16
  • Crashes after a short period of time

    Crashes after a short period of time

    Sorry for all the issues but I'm just trying to get a simple GUI up and running but I'm having quite a lot of problems.

    My current GUI consists of 3 .html documents and 4 .css files (one global and three individual).

    When I open my GUI it works fine at the start, I can click on each item of my menu and it switches between the html documents great. However, if I start clicking on the links in fairly quick succession the program crashes with no error in the console, but the error on the GUI is

    localhost refused to connect

    Even if I don't click very fast, the python script will end, but I can still click around for a while (it's very slow), I presume this is because it's cached or something, and then it will run into the same error as before.

    Has anyone else experienced issues like this? My code is not very complicated.

    Here is my python:

    import eel
    eel.init('web')
    eel.start('settings.html', size=(1216, 736))
    

    And my HTML on all 3 is literally just a menu with links at the moment and the CSS is just simple styling.

    EDIT: I have no such problems if I go to localhost in my browser.

    opened by 04fsnape 15
  • ERR_CONNECTION_REFUSED

    ERR_CONNECTION_REFUSED

    what this error means?

    error: eel.js:115 WebSocket connection to 'ws://localhost:8000/eel?page=select_ger.html' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

    help wanted 
    opened by WMoraes13 14
  • Javascript not work!

    Javascript not work!

    eel 0.12.4 Linux/Debian 9 Chrome

    Hi. when i try to launch a JavaScript function from python nothing happens!

    (PS. All files are located in web dir, except the file python)

    html code

    <html>
       <head>
          <script type="text/javascript" src="eel.js"></script>
          <link rel="stylesheet" type="text/css" href="css/app.css">
          <link rel="stylesheet" href="css/font-awesome.min.css">
          <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, minimum-scale=1.0,maximum-scale=1.0">
          <title>App Login</title>
       </head>
    
       <body>
          <script type="text/javascript" src="eel.js"></script>
          <button onclick='eel.scan();'>Scansione</button>
          <h1>Hello!</h1>
       </body>
    </html>
    

    python code

    # -*- coding: utf-8 -*-
    import eel
    import encodings
    from iwlib import iwlist
    
    eel.init('web', allowed_extensions=['.js', '.html','.css'])
    
    @eel.expose
    def scan():
        result=iwlist.scan('wlan0')
    
        for list_wireless in result:
            essid=list_wireless['ESSID']
            mac=list_wireless['ACCESS POINT']
            channel=list_wireless['CHANNEL']
            freq=list_wireless['FREQUENCY']
    
            print '{} {} {} ({})'.format(essid,mac,channel,str(freq)[0:4])
    
    eel.start('index.html',port=10000,size=(308, 612))
    
    eel.sStampa()
    

    js code

    eel.expose(sStampa);
    function sStampa() {
       console.log('Hellooooo');
    }
    
    bug 
    opened by vincenzogianfelice 14
  • Eel 1.0

    Eel 1.0

    Over Christmas I am planning to put some hours into cleaning up Eel and pushing to a 1.0 release, which should be bug free and stable for a while.

    I am opening this issue so that people can suggest/request features or design changes.

    Stuff I can think of;

    • Renaming exposed functions. I think this is half implemented. You should be able to say eel.expose(actual_function, 'exposed_name').
    • First class Electron support.. It should be easy to use Electron as browser, not have to use 'custom'.
    • Better packaging as standalone app. There seem to be a few issues people are having with pyinstaller. This process could be polished.
    • Better docs/tutorial/examples/wiki.
    • Jinja2 templates support. Have had PR sitting there for this for a while, I will integrate it
    opened by ChrisKnott 13
  • Angular Route/URL error after refresh

    Angular Route/URL error after refresh

    Can you help how to overcome virtual route for angular compatible with eel after refresh, hosting i use .htaccess but in this i have no clue to proceed

    help wanted 
    opened by shidandev 1
  • --noconsole not working

    --noconsole not working

    Hello, I've built an app with eel and now I'm trying to make an executable from it. But if I try to disable the console it doesn't start and shows the following error:

    error

    I'm using this command: python -m eel app.py web --onefile --noconsole --splash splash.png

    and from python I just runeel.start('index.html')

    I tried to redirect sys.stderr and sys.stdout to a StringIO or a PIPE but still the error popup. I'm on windows and the app runs with Chrome.

    help wanted 
    opened by francescofact 3
  • Can't deploy EEL on web server (hosting) with Cpanel

    Can't deploy EEL on web server (hosting) with Cpanel

    I created a very small web application with EEL but I absolutely don't understand how to launch eel.start(...) with my web host (which works with Cpanel). Cpanel requests a wsgi callable object. I looked on the web but apart from a successful "Hello world", nothing worked. I can't launch the app, even looking at the side of Bottle.

    If anyone has a solution to create a valid wsgi that allows running EEL, I'm very interested. Thanks a lot.

    help wanted 
    opened by MathieuChartier86 0
  • Fixed Tests v2

    Fixed Tests v2

    Hello,

    Sorry I did a really bad job of the first PR so I am trying again,

    Copy of the original comments #632 :

    @samuelhwilliams

    Amazing work - the tests do indeed all seem to run and pass which is more than we've had for a long time 🎉 I do think we need to revisit some of this code and clean it up though. I'm particularly not fond of vendoring the binaries and would like to find a solution that doesn't require us to do that. 🤔 Could you squash the commits down into either: a set of logical separate commits, or just a single commit if there's not a sensible separation between them?

    The code is definitely a mess and very "hacky". Do you have any suggestion for testing without the binary? I'm not sure how else tests could be done on Eel

    Thank you

    • Doug
    opened by doug-benn 1
  • Cannot read properties of undefined (reading 'send')

    Cannot read properties of undefined (reading 'send')

    Problem "Uncaught TypeError: Cannot read properties of undefined (reading 'send')" when i trying run a function with "eel.nice()" inside.

    app.py

    @eel.expose
    def nice():
        print("GG")
    

    topnav.html

            checkBox = document.getElementById('flexSwitchCheckDefault').addEventListener('click', event => {
                if(event.target.checked) {
                    eel.nice()
                    document.getElementById("languageSelect").setAttribute("disabled", '');
                }
                else {
                    eel.nice()
                    document.getElementById("languageSelect").removeAttribute("disabled");
                }
            });
    

    This problem only appears if you put another code file using jquery. Is there an option when importing another html file to fix the problem or will EEL only work directly? Script in index.html:

     $(function(){
          $("#includedContent").load("topnav.html"); 
        });
    

    image

    Desktop

    • OS: Windows 10 Pro
    • Browser: chrome
    • Version 110.0.5468.0, canary (64 bit)
    help wanted 
    opened by ZeralldMC 0
Releases(v0.15.1)
Owner
Chris Knott
Chris Knott
Learn to build a Python Desktop GUI app using pywebview, Python, JavaScript, HTML, & CSS.

Python Desktop App Learn how to make a desktop GUI application using Python, JavaScript, HTML, & CSS all thanks to pywebview. pywebview is essentially

Coding For Entrepreneurs 55 Jan 5, 2023
A desktop application for JupyterLab, based on Electron.

A desktop application for JupyterLab, based on Electron.

JupyterLab 2.1k Jan 2, 2023
Build GUI for your Python program with JavaScript, HTML, and CSS

https://pywebview.flowrl.com pywebview is a lightweight cross-platform wrapper around a webview component that allows to display HTML content in its o

Roman 3.3k Jan 1, 2023
A GUI for designing Python GUI's for PySimpleGUI.

SimpleGUIBuilder A GUI for designing Python GUI's for PySimpleGUI. Installation There is none :) just download the file from a release and run it. Don

Miguel Martins 65 Dec 22, 2022
PyQt5 Sample GUI Program - Python PyQt5 Sample GUI application

Python PyQt5 Sample GUI application Program work like this Designed GUI using De

Dimuth De Zoysa 5 Mar 27, 2022
The GUI application by Python3.8. Using QT Design draw UI and generator UI XML file provides to PySide2 build GUI components

The GUI application by Python3.8. Using QT Design draw UI and generator UI XML file provides to PySide2 build GUI components. Total adopt OOD design class, service, and abstract class. OOP implemented this project.

Jiage 1 Jan 11, 2022
guietta - a tool for making simple Python GUIs

guietta - a tool for making simple Python GUIs

Alfio Puglisi 1.9k Jan 8, 2023
Write desktop and web apps in pure Python

Flexx Want to stay up-to-date about (changes to) Flexx? Subscribe to the NEWS issue. Introduction Flexx is a pure Python toolkit for creating graphica

flexxui 3.1k Dec 29, 2022
Write desktop and web apps in pure Python

Flexx Want to stay up-to-date about (changes to) Flexx? Subscribe to the NEWS issue. Introduction Flexx is a pure Python toolkit for creating graphica

flexxui 3.1k Jan 8, 2023
Make desktop applications using HTML and CSS with python

Neutron Make desktop applications using HTML and CSS with python What is Neutron Neutron will allow developers to design modern applications in python

Ian Baldelli 284 Dec 29, 2022
Edifice: a declarative GUI library for Python

Edifice is a Python library for building reactive UI, inspired by modern Javascript libraries such as React.

David Ding 193 Dec 11, 2022
AppQuickLauncher is a tool that can quickly launch apps by clicking the app tray icon.

AppQuickLauncher AppQuickLauncher is a tool that can quickly launch apps by clicking the app tray icon. On Windows 7 or Windows 10, we can add a folde

yin kaisheng 2 Sep 11, 2022
Use CSS styling in Tkinter apps

cssTk To-Do Support Upto CSS 4.15 Set Up Docs Features * Corner Radius Gradient BG Blur Animations Usage Scenarios Allows easy import of GTK 3 and GTK

RUG 5 Oct 18, 2022
Simple GUI python app to show a stocks graph performance. Made with Matplotlib and Tiingo.

stock-graph-python Simple GUI python app to show a stocks graph performance. Made with Matplotlib and Tiingo. Tiingo API Key You will need to add your

Toby 12 May 14, 2022
A simple GUI designer for the python tkinter module

Leer en Español Welcome to Pygubu! Pygubu is a RAD tool to enable quick and easy development of user interfaces for the Python's tkinter module. The u

Alejandro Autalán 1.7k Dec 27, 2022
Chatterpatter - A simple GUI complex backend Chat Application made using python

Chatterpatter - A simple GUI complex backend Chat Application made using python

Gurneet Singh 2 Jan 8, 2022
LyricsGenerator - A simple GUI made using Python(Tkinter) for generating song lyrics

Lyrics Generator Reference :- https://www.geeksforgeeks.org/create-a-gui-to-extr

Somya Ranjan Sahu 3 Mar 25, 2022
A html canvas based screencasting server with occasional ground-truth updates via screenshots and very fast input drawing

rm2canvas A html canvas based screencasting server for the reMarkable 1/2 digital paper systems. It draws live on the canvas from the remarkables touc

null 45 Sep 8, 2022
A simple todo GUI applicaiton

simple_todo_gui A simple todo GUI applicaiton To create an .exe file, run 'Python setup.py build' after installing PyQt5 and cx_Freeze with pip. Then

Dhammike Piyumal 2 Nov 11, 2021