Remi is a GUI library for Python applications that gets rendered in web browsers

Overview

Build Status

GUI library for your Python applications

Remi is a GUI library for Python applications that gets rendered in web browsers. This allows you to access your interface locally and remotely.

Do you need support?

Reddit - (subreddit RemiGUI)

There is also a drag n drop GUI Editor. Look at the Editor subfolder to download your copy.

A demostrative video from the great REVVEN labs

Getting Started

For a stable version:

pip install remi

For the most updated experimental version Download or check out Remi from git and install

python setup.py install

or install directly using pip

pip install git+https://github.com/dddomodossola/remi.git

Then start the test script (download it from github https://github.com/dddomodossola/remi/blob/master/examples/widgets_overview_app.py):

python widgets_overview_app.py

Remi

Platform independent Python GUI library. In less than 100 Kbytes of source code, perfect for your diet.

Remi enables developers to create platform independent GUI with Python. The entire GUI is rendered in your browser. No HTML is required, Remi automatically translates your Python code into HTML. When your app starts, it starts a web server that will be accessible on your network.

A basic application appears like this:

import remi.gui as gui
from remi import start, App

class MyApp(App):
    def __init__(self, *args):
        super(MyApp, self).__init__(*args)

    def main(self):
        container = gui.VBox(width=120, height=100)
        self.lbl = gui.Label('Hello world!')
        self.bt = gui.Button('Press me!')

        # setting the listener for the onclick event of the button
        self.bt.onclick.do(self.on_button_pressed)

        # appending a widget to another, the first argument is a string key
        container.append(self.lbl)
        container.append(self.bt)

        # returning the root widget
        return container

    # listener function
    def on_button_pressed(self, widget):
        self.lbl.set_text('Button pressed!')
        self.bt.set_text('Hi!')

# starts the web server
start(MyApp)

In order to see the user interface, open your preferred browser and type "http://127.0.0.1:8081". You can change the URL address by specific **kwargs at start function call. This will be discussed later.

Tested on Android, Linux, Windows. Useful on Raspberry Pi for Python script development. It allows interacting with your Raspberry Pi remotely from your mobile device.

FAQ

  • Why another GUI lib? Kivy, PyQT, and PyGObject all require native code for the host operating system, which means installing or compiling large dependencies. Remi needs only a web browser to show your GUI.

  • Do I need to know HTML? NO, It is not required, you have to code only in Python.

  • Is it open source? For sure! Remi is released under the Apache License. See the LICENSE file for more details.

  • Do I need some kind of web server? No, it's included.

Brief tutorial

Import Remi library and some other useful stuff.

import remi.gui as gui
from remi import start, App

Subclass the App class and declare a main function that will be the entry point of the application. Inside the main function you have to return the root widget.

class MyApp(App):
    def __init__(self, *args):
        super(MyApp, self).__init__(*args)

    def main(self):
        lbl = gui.Label("Hello world!", width=100, height=30)

        # return of the root widget
        return lbl

Outside the main class, start the application by calling the function start and passing the name of the class you declared previously as the parameter:

# starts the webserver
start(MyApp)

Run the script. If it's all OK the GUI will be opened automatically in your browser, otherwise, you have to type in the address bar "http://127.0.0.1:8081".

You can customize optional parameters in the start call like:

start(MyApp, address='127.0.0.1', port=8081, multiple_instance=False, enable_file_cache=True, update_interval=0.1, start_browser=True)

Parameters:

  • address: network interface IP
  • port: listen port
  • multiple_instance: boolean, if True multiple clients that connect to your script has different App instances (identified by unique cookie session identifier)
  • enable_file_cache: boolean, if True enable resource caching
  • update_interval: GUI update interval in seconds. If zero, the update happens at each change. If zero, the App.idle method is not called.
  • start_browser: boolean that defines if the browser should be opened automatically at startup
  • standalone: boolean, indicates where to run the application as a standard Desktop application with its own window. If False, the interface is shown in a browser webpage.

Additional Parameters:

  • username: for a basic HTTP authentication
  • password: for a basic HTTP authentication
  • certfile: SSL certificate filename
  • keyfile: SSL key file
  • ssl_version: authentication version (i.e. ssl.PROTOCOL_TLSv1_2). If None disables SSL encryption

All widgets constructors accept two standards**kwargs that are:

  • width: can be expressed as int (and is interpreted as a pixel) or as str (and you can specify the measuring unit like '10%')
  • height: can be expressed as int (and is interpreted as a pixel) or as str (and you can specify the measuring unit like '10%')

Events and callbacks

Widgets expose a set of events that happen during user interaction. Such events are a convenient way to define the application behavior. Each widget has its own callbacks, depending on the type of user interaction it allows. The specific callbacks for the widgets will be illustrated later.

In order to register a function as an event listener you have to call a function like eventname.do (i.e. onclick.do) passing as parameters the callback that will manage the event. Follows an example:

import remi.gui as gui
from remi import start, App

class MyApp(App):
    def __init__(self, *args):
        super(MyApp, self).__init__(*args)

    def main(self):
        container = gui.VBox(width=120, height=100)
        self.lbl = gui.Label('Hello world!')
        self.bt = gui.Button('Press me!')

        # setting the listener for the onclick event of the button
        self.bt.onclick.do(self.on_button_pressed)

        # appending a widget to another, the first argument is a string key
        container.append(self.lbl)
        container.append(self.bt)

        # returning the root widget
        return container

    # listener function
    def on_button_pressed(self, widget):
        self.lbl.set_text('Button pressed!')
        self.bt.set_text('Hi!')

# starts the web server
start(MyApp)

In the shown example self.bt.onclick.do(self.on_button_pressed) registers the self's on_button_pressed function as a listener for the event onclick exposed by the Button widget. Simple, easy.

Listener's callbacks will receive the emitter's instance firstly, then all other parameters provided by the specific event.

Besides the standard event registration (as aforementioned), it is possible to pass user parameters to listener functions. This can be achieves appending parameters to the do function call.

import remi.gui as gui
from remi import start, App

class MyApp(App):
    def __init__(self, *args):
        super(MyApp, self).__init__(*args)

    def main(self):
        container = gui.VBox(width=120, height=100)
        self.lbl = gui.Label('Hello world!')
        self.bt = gui.Button('Hello name!')
        self.bt2 = gui.Button('Hello name surname!')

        # setting the listener for the onclick event of the buttons
        self.bt.onclick.do(self.on_button_pressed, "Name")
        self.bt2.onclick.do(self.on_button_pressed, "Name", "Surname")

        # appending a widget to another
        container.append(self.lbl)
        container.append(self.bt)
        container.append(self.bt2)

        # returning the root widget
        return container

    # listener function
    def on_button_pressed(self, widget, name='', surname=''):
        self.lbl.set_text('Button pressed!')
        widget.set_text('Hello ' + name + ' ' + surname)

# starts the web server
start(MyApp)

This allows great flexibility, getting different behaviors with the same event listener definition.

HTML Attribute accessibility

Sometimes it is required to access Widget's HTML representation in order to manipulate HTML attributes. The library allows accessing this information easily.

A simple example: It is the case where you would like to add a hover text to a widget. This can be achieved by the title attribute of an HTML tag. In order to do this:

    widget_instance.attributes['title'] = 'Your title content'

A special case of HTML attribute is the style. The style attributes can be altered in this way:

    widget_instance.style['color'] = 'red'

The assignment of a new attribute automatically creates it.

For a reference list of HTML attributes, you can refer to https://www.w3schools.com/tags/ref_attributes.asp

For a reference list of style attributes, you can refer to https://www.w3schools.com/cssref/default.asp

Take care about internally used attributes. These are:

  • class: It is used to store the Widget class name for styling purpose
  • id: It is used to store the instance id of the widget for callback management

Remote access

If you are using your REMI app remotely, with a DNS and behind a firewall, you can specify special parameters in the start call:

  • port: HTTP server port. Don't forget to NAT this port on your router;
start(MyApp, address='0.0.0.0', port=8081)

Standalone Execution

I suggest using the browser as a standard interface window.

However, you can avoid using the browser. This can be simply obtained joining REMI and PyWebView. Here is an example about this standalone_app.py.

Be aware that PyWebView uses qt, gtk and so on to create the window. An outdated version of these libraries can cause UI problems. If you experience UI issues, update these libraries, or better avoid standalone execution.

Authentication

In order to limit remote access to your interface, you can define a username and password. It consists of a simple authentication process. Just define the parameters username and password in the start call:

start(MyApp, username='myusername', password='mypassword')

Styling

In order to define a new style for your app, you have to do the following. Create a res folder and pass it to your App class constructor:

class MyApp(App):
    def __init__(self, *args):
        res_path = os.path.join(os.path.dirname(__file__), 'res')
        super(MyApp, self).__init__(*args, static_file_path={'res':res_path})

Copy the standard style.css file from the remi folder and paste it inside your res folder. Edit it in order to customize. This way the standard style.css file gets overridden by the one you created.

Compatibility

Remi is made to be compatible from Python2.7 to Python3.X. Please notify compatibility issues.

Security

Remi should be intended as a standard desktop GUI framework. The library itself doesn't implement security strategies, and so it is advised to not expose its access to unsafe public networks.

When loading data from external sources, consider protecting the application from potential javascript injection before displaying the content directly.

Contributors

Thank you for collaborating with us to make Remi better!

The real power of opensource is contributors. Please feel free to participate in this project, and consider to add yourself to the contributors list. Yes, I know that GitHub already provides a list of contributors, but I feel that I must mention who helps.

Projects using Remi

PySimpleGUI: Launched in 2018 Actively developed and supported. Supports tkinter, Qt, WxPython, Remi (in browser). Create custom layout GUI's simply. Python 2.7 & 3 Support. 100+ Demo programs & Cookbook for rapid start. Extensive documentation.

App Template For REMI: A really well written template for multiview applications.

Web based dynamic reconfigure for ROS robots

razmq

Espresso-ARM

PiPresents

The Python Banyan Framework

LightShowPi show manager

rElectrum: A powerful promising Electrum wallet manager for safe transactions.

Other Implementations

Listed here are other implementations of this library:

Comments
  • SyntaxError on running python3 widgets_overview_app.py

    SyntaxError on running python3 widgets_overview_app.py

    Hi, Just going through the tutorial, and getting the following error:

    File "widgets_overview_app.py", line 7

    SyntaxError: invalid syntax

    Any suggestions? Thanks

    opened by pawelevans 50
  • how I accept the post data ?

    how I accept the post data ?

    I want write a app gui which can accept the cam data from the network, how can I do? class OpencvVideoWidget(gui.Image): def init(self, video_source=0, fps=10, **kwargs): super(OpencvVideoWidget, self).init("/%s/get_image_data" % id(self), **kwargs) self.fps = fps #self.capture = cv2.VideoCapture(video_source)

        javascript_code = gui.Tag()
        javascript_code.type = 'script'
        javascript_code.attributes['type'] = 'text/javascript'
        javascript_code.add_child('code', """
            function update_image%(id)s(){
            if(document.getElementById('%(id)s').getAttribute('play')=='False')
            return;
            
            var url = '/%(id)s/get_image_data';
            var xhr = new XMLHttpRequest();
            xhr.open('GET', url, true);
            xhr.responseType = 'blob'
            xhr.onload = function(e){
            var urlCreator = window.URL || window.webkitURL;
            var imageUrl = urlCreator.createObjectURL(this.response);
            document.getElementById('%(id)s').src = imageUrl;
            }
            xhr.send();
            };
            
            setInterval( update_image%(id)s, %(update_rate)s );
            """ % {'id': id(self), 'update_rate': 1000.0 / self.fps})
        
        self.add_child('javascript_code', javascript_code)
        self.play()
    
    def play(self):
        self.attributes['play'] = True
    
    def stop(self):
        self.attributes['play'] = False
        
    def post_some_data():
        """
        predicts requested text whether it is ham or spam
        :return: json
        """
       img_encode=request.files.get("image").read()
        image_np = np.asarray(bytearray(img_encode), dtype="uint8")
        image = cv2.imdecode(image_np, cv2.IMREAD_COLOR)
        AID_CAMERA.put(image, block=True)
        return jsonify({'you sent this': request.form.get("text")})
    
    def get_image_data(self):
        ret, frame = AID_CAMERA.get()
        if ret:
            ret, jpeg = cv2.imencode('.jpg', frame)
            if ret:
                headers = {'Content-type': 'image/jpeg'}
                # tostring is an alias to tobytes, which wasn't added till numpy 1.9
                return [jpeg.tostring(), headers]
        return None, None
    

    when I write the HttpPost request = new HttpPost("http://127.0.0.1:8000/Image/post_some_data") to post the data, it is not working: this is log info:

    KeyError: 'filename' 127.0.0.1 - - [11/Jun/2019 06:15:19] "POST /Image/post_some_data HTTP/1.1" 400 - start process cam data.... <socket._socketobject object at 0x702b13d6e0> remi.request ERROR post: failed

    how can I accept the post data with Remi?

    opened by aidlearning 38
  • onclick should not always have `event.preventDefault()`

    onclick should not always have `event.preventDefault()`

    When adding an onclick listener to a widget, it adds the following onclick attributes to the html object:

    sendCallback('XXXXXXXX','onclick');event.stopPropagation();event.preventDefault();
    

    The event.preventDefault() part causes issues if you put any widget with a "default" action like a checkbox or a link inside a container which has an onclick listener. The default action will be stopped at the parent and the checkbox, link, etc won't work.

    I can understand why the event.preventDefault() makes sense. If you add an onclick listener directly on a link, checkbox, etc, you probably want it to replace its default action. It would however be nice to have the option to skip it when adding onclick listeners to containers.

    My example use case

    I have created a Modal widget which consists of a backdrop, a modal and a content (code can be found here).

    The backdrop has an onclick listener to close the modal on click.

    The modal has a dummy onclick listener which does nothing but stopping the event propagation (otherwise clicking on the modal would trigger the backdrop listener).

    The content has a form with inputs and links. The checkboxes and links don't work since the parents (both modal and backdrop) have event.preventDefault() in their onclick attribute.

    A temporary hack that I found to overcome this issue is to re-implement checkbox functionality in an onclick listener:

    checkbox.onclick.do(lambda w: checkbox.set_value(not checkbox.get_value()))
    

    but this is not very practical.

    opened by pec0ra 25
  • [Question] Use Remi with OpenCV in termux

    [Question] Use Remi with OpenCV in termux

    Hi. I'm new to remi and I think it is a really cool project. I want to capture the stream from the browser and process it in opencv in termux android app and display it on the browser. I found the link of your smartphone camera which captures feed in the browser: https://repl.it/@DavideRosa/smartphoneremotephoto. How do I use this stream and feed it to the opencv application so that I can process it and show the processed result? Help would be greatly appreciated.

    opened by jude94paul 24
  • Remi behind jupyter server proxy

    Remi behind jupyter server proxy

    • Designed with minimal remi change in mind (see diff files to estimate the level of change)
    • For both remi core and remi apps (minimal change)
    • Fully tested with jupyter-server-proxy
    • Jupyter notebooks provided
    • works only with 3.6+ (f"" string interpolation)
    • If proxy not used, legacy remi app are working
    • adding proxy feature need some remi app rework (to calculate url for the front-end)
    "url('/editor_resources:resize.png')" => f"url({_proxy.set_url('/editor_resources:resize.png')})"
    # if directly provided to front-end
    # if url are passed to Image or the like, no change
    
    opened by gbrault 20
  • remi label set_text() newlines

    remi label set_text() newlines

    Hello I am trying to display a multi-line file with the Remi label object and the set_text() method. However, the set_text() method does not seem to respond to /n and the label shows a giant blob of text. Thank you for your help

    opened by Brianzhengca 20
  • Make the connection more reliable on bad condition networks

    Make the connection more reliable on bad condition networks

    Also this adds parameters to tune the timeout on checking if the data was sent and how big the pending messages buffer can be.

    With values like 10 on bad networks this made the connection drop a lot more frequently which made the renewConnection pop a lot more.

    opened by awesomebytes 20
  • Proposal: Prettify code

    Proposal: Prettify code

    I have a proposal to make the code closer to PEP-8 standard. There are quite good tools these days to help you along, I typically set up pre-commit with black and flake8. This can then easily be added in e.g. Travis so that any merge request is automatically checked after..

    This merge commit already contains a proposed first config for the pre-commit, as well as automatic code cleaning from the black tool. There are numerous proposals from flake8 as well (see the ignore-list in the config file), however those edits are more manual to fix. Hence I thought I'd ask if you think this makes sense before I start on the endeavour of going through them..

    opened by Eothred 19
  • Need a simple SAAS APP example with Remi

    Need a simple SAAS APP example with Remi

    Hi everyone, I just discovered Remi for developing python applications for web use. I need a simple example for the GUI of SAAS product using Remi.

    in fact I would like to launch a python code from a remote pc (outside the pc on which the code is located), is this possible with Remi?

    Thanks a lot Ali

    opened by Ali-RAFIEE 18
  • [Bug - Regression problem ] Label Widget lost set_layout_orientation method.  Worked fine in 2020.1.

    [Bug - Regression problem ] Label Widget lost set_layout_orientation method. Worked fine in 2020.1.

    This code previously worked:

                    element.Widget = remi.gui.Label(element.DisplayText)
                    element.Widget.set_layout_orientation(True)
    

    but after a recent Remi upgrade it crashes with this error

    Traceback (most recent call last):
      File "C:/Python/PycharmProjects/GooeyGUI/PySimpleGUIWeb.py", line 5121, in setup_remi_window
        PackFormIntoFrame(window, master_widget, window)
      File "C:/Python/PycharmProjects/GooeyGUI/PySimpleGUIWeb.py", line 4206, in PackFormIntoFrame
        element.Widget.set_layout_orientation(True)
    AttributeError: 'Label' object has no attribute 'set_layout_orientation'
    
    opened by PySimpleGUI 17
  • Predict second port

    Predict second port

    I want to run my code on a remote server and be able to SSH and tunnel my ports for connecting to the GUI.

    My current problem is that I can't predict what the second port will be. It seems to be randomly selecting a port, but I'm not sure how.

    opened by ttufts 17
  • Label and SpinBox widgets do not align

    Label and SpinBox widgets do not align

    I tried to apply style="text-align: right; vertical-align: middle" to both Label and SpinBox objects that are arranged side by side with the same height setting. But it seems the "vertical-align: middle" does not have any effect. These two objects always misaligned vertically even within the same HBox. Why does it work this way?

    opened by occoder 2
  • Hello, I have a program made with remi, and there is a problem with the page layout disorder between different devices. I look forward to your reply!

    Hello, I have a program made with remi, and there is a problem with the page layout disorder between different devices. I look forward to your reply!

    Hello, I have a program made with remi. On the computer I developed, the layout of all web pages is normal. But when the program runs on my other computer, the page layout is wrong! What is the problem? (The screen resolutions of the two computers are inconsistent) Looking forward to your reply!

    opened by charles114 10
  • fix cannot support play mp4 static file in safari browser.

    fix cannot support play mp4 static file in safari browser.

    fix cannot support play mp4 static file in safari browser.

     remi/server.py -> App -> _process_all
    

    before

                filename = self._get_static_file(static_file.groups()[0])
                if not filename:
                    self.send_response(404)
                    return
                mimetype, encoding = mimetypes.guess_type(filename)
                self.send_response(200)
                self.send_header('Content-type', mimetype if mimetype else 'application/octet-stream')
                if self.server.enable_file_cache:
                    self.send_header('Cache-Control', 'public, max-age=86400')
                self.end_headers()
                with open(filename, 'rb') as f:
                    content = f.read()
                    self.wfile.write(content)
    

    after

                filename = self._get_static_file(static_file.groups()[0])
                if not filename:
                    self.send_response(404)
                    return
                mimetype, encoding = mimetypes.guess_type(filename)
                response_code = 200
                content = None
                send_response_code = None
                with open(filename, 'rb') as f:
                    content = f.read()
                for k in self.headers:
                    if k.lower() == 'range':
                        self._log.info('Start resumable pass.')
                        # self._log.info(self.headers)
                        range_value = self.headers[k]
                        range_value_comp = re.compile(r'bytes=([0-9]+)\-(([0-9]+)?)')
                        m = re.match(range_value_comp, range_value)
                        if m:
                            start_range = m.group(1)
                            start = int(start_range)
                            end_range = m.group(2)
                            if len(end_range) > 0:
                                end = int(end_range)
                            else:
                                end = -1
                            print(start, end_range, len(content))
                            if end == len(content) -1:
                                response_code = 200
                            else:
                                response_code = 206
                            self.send_response(response_code)
                            send_response_code = True
                            if end == -1:
                                # headers['Content-Length'] = str(len(content) - start)
                                self.send_header('Content-Length', str(len(content) - start))
                            else:
                                # headers['Content-Length'] = str(end - start + 1
                                self.send_header('Content-Length', str(end - start + 1))
                            if end < 0:
                                content_range_header_value = "bytes %d-%d/%d" % (start, len(content) - 1, len(content))
                                content = content[start:len(content)]
                            else:
                                content_range_header_value = "bytes %d-%d/%d" % (start, end, len(content))
                                content = content[start:end + 1]
                            # headers['Content-Range'] = content_range_header_value
                            self.send_header('Content-Range', content_range_header_value)
                if not send_response_code:
                    self.send_response(response_code)
                self.send_header('Content-type', mimetype if mimetype else 'application/octet-stream')
                if self.server.enable_file_cache:
                    self.send_header('Cache-Control', 'public, max-age=86400')
                self.end_headers()
                if content:
                    self.wfile.write(content)
    
    opened by justwdh 1
  • non-latin support

    non-latin support

    I've had problems with Cyrillic filenames when creating FileDownloader object, and I was able to fix it just by changing line 701 in server.py to self.send_header(k, urllib.parse.quote_plus(headers[k]))

    opened by lopatoid 1
Releases(2019.4)
Owner
Davide Rosa
KUKA Robot developer for steel industry applications. Passionate C/C++, Python developer. Experienced machine vision developer. Employed at IMTS srl Italy.
Davide Rosa
This a pythonTkinter GUI with sqlite3 Project.

FootballGym_MIS This a pythonTkinter GUI with sqlite3 Project. This software is useful if you want to enjoy running a gym. It helps you know which tea

Hikmatullah Mohammadi 2 Jun 19, 2022
This is a GUI based text and image messenger. Other functionalities will be added soon.

Pigeon-Messenger (Requires Python and Kivy) Pigeon is a GUI based text and image messenger using Kivy and Python. Currently the layout is built. Funct

4 Jan 21, 2022
A Python based Connect 4 game made with DearPyGUI

Ultimate-Connect-4 A Python based Connect 4 game made with DearPyGUI NOTICE: If you connect to the game server hosted by Jah-On and attempt to send ma

4 Jun 01, 2022
A system tray application written in python that will assist you with your keyboard endeavors.

A system tray application written in python that will assist you with your keyboard endeavors. It has features such as abbreviation, email autofill, media control, writing from clipboard ,typing curr

Mach50 1 Dec 15, 2021
LittlePythonGUIGuide - This is a short GUI Guide with python

This is a short GUI Guide with python, learning how to use the simple and easy moduel built into python, named tkinter.

1cy50ng3b0b 1 Nov 21, 2021
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 05, 2023
This is the new and improved Plex Automatic Pre-roll script with a GUI

Plex-Automatic-Pre-roll-GUI This is the new and improved Plex Automatic Pre-roll script with a GUI! It should be stable but if you find a bug please l

164 Nov 04, 2022
A Windows Dock Widget Written In Pure Python

VEПUS A Windows Dock Widget Written In Pure Python What is Venus? Venus is a Dock Widget for your desktops interface. It adds a couple of really cool

Secrets 18 Dec 30, 2022
The quick and easy way to add versatile graphical interfaces with networking capabilities to your Python programs.

The quick and easy way to add versatile graphical interfaces with networking capabilities to your Python programs. Give instant access to your application to whoever you want on the Internet, without

Claude SIMON 215 Dec 28, 2022
A graphical user interface calendar with python

GUI-Calendar A graphical user interface calendar with python In this project I used tkinter module If you dont have tkinter module you can install it

Arone Sadegh 1 Dec 18, 2021
Py address book gui - An address book with graphical user interface developed with Python Tkinter

py_address_book_gui An address book with graphical user interface developed with

Milton 4 Feb 01, 2022
Gmail account using brute force attack

Programmed in Python | PySimpleGUI Gmail Hack Python script with PySimpleGUI for hack gmail account using brute force attack If you like it give it

Adrijan 127 Dec 30, 2022
A small manager/GUI Frontend for QEMU written in Python

qemu-manager A small manager/GUI Frontend for QEMU written in Python Requirements You'll need to have the following tools installed to run this: QEMU

yeppiidev 15 Dec 21, 2022
A desktop application for JupyterLab, based on Electron.

A desktop application for JupyterLab, based on Electron.

JupyterLab 2.1k Jan 02, 2023
A GUI frontend developed in Python3 for simple admin tasks on MySQL-Server running on the localhost

A GUI frontend developed in Python3 for simple admin tasks on MySQL-Server running on the localhost. Developed for my CS School Project.

1 May 29, 2022
Dress up your code with a beautiful graphical user interface !

Dresscode Dress up your code with a beautiful graphical user interface ! This project is part of the Pyrustic Ecosystem. Look powered by the cyberpunk

20 Aug 24, 2022
Create shortcuts on Windows to your Python, EXE, Batch files or any other file using a GUI made with PySimpleGUI

shor Windows Shortcut Creation Create Windows Shortcuts to your python programs and any other file easily using this application created using PySimpl

PySimpleGUI 7 Nov 16, 2021
Python Web Version 3.0 Using PyQty module

Python-Web-Version-3.0 Python Web Version 3.0 Using PyQty module you have to install pyinstaller module then install PyQt5 module and install PyQtwebE

JehanKandy 9 Jul 13, 2022
Criando interfaces gráficas com Python e Qt 6 (PyQt6)

Criando interfaces gráficas com Python e Qt 6 (PyQt6) Qt O Qt é um framework para criação de interfaces gráficas multiplataforma, atualmente ele é des

Renato Cruz 1 Jun 07, 2022
python+PySimpleGUI+pyserial+threading

GUI_pyserial python+PySimpleGUI+pyserial+threading 功能 1.利用PySimpleGUI制作图形用户界面 2.利用threading实现多线程调用pyserial处理串口通信 模块版本 PySimpleGUI 4.46.0 pyserial 3.5

2 Dec 27, 2022