Write interactive web app in script way.

Overview

PyWebIO

Write interactive web app in script way.

Percy visual test Code coverage Jsdelivr hit count Documentation Status Package version Python Version
Python code quality Javascript code quality License
[Document] | [Demos] | [Why PyWebIO?]

English | 中文

PyWebIO provides a series of imperative functions to obtain user input and output on the browser, turning the browser into a "rich text terminal", and can be used to build simple web applications or browser-based GUI applications without the need to have knowledge of HTML and JS. PyWebIO can also be easily integrated into existing Web services. PyWebIO is very suitable for quickly building applications that do not require complex UI.

PyWebIO output demo PyWebIO input demo

Features:

  • Use synchronization instead of a callback-based method to get input
  • Non-declarative layout, simple and efficient
  • Less intrusive: old script code can be transformed into a Web application only by modifying the input and output operation
  • Support integration into existing web services, currently supports Flask, Django, Tornado, aiohttp, FastAPI framework
  • Support for asyncio and coroutine
  • Support data visualization with third-party libraries, e.g., plotly, bokeh, pyecharts.

Installation

Stable version:

pip3 install -U pywebio

Development version:

pip3 install -U https://code.aliyun.com/wang0618/pywebio/repository/archive.zip

Prerequisites: PyWebIO requires Python 3.5.2 or newer

Quickstart

Hello, world

Here is a simple PyWebIO script to calculate the BMI:

from pywebio.input import input, FLOAT
from pywebio.output import put_text

def bmi():
    height = input("Your Height(cm):", type=FLOAT)
    weight = input("Your Weight(kg):", type=FLOAT)

    BMI = weight / (height / 100) ** 2

    top_status = [(14.9, 'Severely underweight'), (18.4, 'Underweight'),
                  (22.9, 'Normal'), (27.5, 'Overweight'),
                  (40.0, 'Moderately obese'), (float('inf'), 'Severely obese')]

    for top, status in top_status:
        if BMI <= top:
            put_text('Your BMI: %.1f, category: %s' % (BMI, status))
            break

if __name__ == '__main__':
    bmi()

This is just a very simple script if you ignore PyWebIO, but using the input and output functions provided by PyWebIO, you can interact with the code in the browser [demo]:

PyWebIO demo

Serve as web service

The above BMI program will exit immediately after the calculation, you can use pywebio.start_server() to publish the bmi() function as a web application:

from pywebio import start_server
from pywebio.input import input, FLOAT
from pywebio.output import put_text

def bmi(): # bmi() keep the same
    ...  

if __name__ == '__main__':
    start_server(bmi, port=80)

Integration with web framework

To integrate a PyWebIO application into Tornado, all you need is to add a RequestHandler to the existing Tornado application:

import tornado.ioloop
import tornado.web
from pywebio.platform.tornado import webio_handler

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

if __name__ == "__main__":
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/bmi", webio_handler(bmi)),  # bmi is the same function as above
    ])
    application.listen(port=80, address='localhost')
    tornado.ioloop.IOLoop.current().start()

Now, you can open http://localhost/bmi for BMI calculation.

For integration with other web frameworks, please refer to document.

Demos

  • Basic demo : PyWebIO basic input and output demos and some small applications written using PyWebIO.
  • Data visualization demo : Data visualization with the third-party libraries, e.g., plotly, bokeh, pyecharts.

Document

Document is on https://pywebio.readthedocs.io

Comments
  • 文件上传功能对于pdf文件编码错误

    文件上传功能对于pdf文件编码错误

    注: 对于PyWebIO使用咨询或对于其他人也可能有帮助的问题,请考虑移至 Discussions 进行发帖。

    BUG描述 用 file = file_upload(label = 'xxx', accept=['.pdf'], max_size='100M', multiple=False, placeholder='.pdf, )

    上传pdf文件时,大于10M的文件很多时候都会报错,错误如下: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaf in position 1: invalid start byte

    但同样的文件我通过iPhone iOS 15.3的chrome浏览器又能上传成功(有时候),有其他人和我说他们很多大文件pdf也都会传不上去。

    我通过手机上传成功的这个pdf文件,我再进一步对它处理,也会报错。 但我直接在电脑上处理这个pdf文件却没有问题。 所以我感觉在file_upload这个function对于pdf的编码上是否存在一些问题?

    环境信息

    • 操作系统及版本: Ubuntu 20
    • 浏览器及版本: Chrome, iphone chrome ... and other andriod phone web browser
    • Python版本: python3 .7
    • PyWebIO版本: 1.5.2
    bug 
    opened by alexmaehon 14
  • 处理某些word文档会导致网站崩溃

    处理某些word文档会导致网站崩溃

    注: 对于PyWebIO使用咨询或对于其他人也可能有帮助的问题,请考虑移至 Discussions 进行发帖。

    BUG描述 在用mammoth包处理某些word文档的时候,整个网站会崩溃,但另外一些就很正常。但单独用mammoth包处理文件是没问题的,和pywebio一起用的时候,pywebio直接shutdown,连报错都没有。代码如下:

    pip install mammoth
    pip install pywebio
    
    import mammoth
    from pywebio.input import *
    
    file = file_upload(label = '上传要翻译的文件', 
                        accept=['.docx'],
                        max_size='100M',
                        multiple=False,
                        placeholder='.docx',
                        )
    
    file_path = os.path.join(os.getcwd(), file['filename'])
    result = mammoth.convert_to_html(file_path)
    

    附带文件:test.docx是没问题的,test2.docx会导致网站崩溃

    环境信息 操作系统及版本: Ubuntu 18 lts 浏览器及版本: Chrome Python版本: python3 .7 PyWebIO版本: 1.5. test.docx test2.docx

    bug 
    opened by alexmaehon 8
  • [feature request] auto-load app when running the app, and auto-refresh when changing the code

    [feature request] auto-load app when running the app, and auto-refresh when changing the code

    I have built a webapp which runs like so:

    pywebio.start_server(app, port=8080, debug=True)

    But when I run the code, it does not automatically open the app in the browser; I need to manually type the address in the browser and run it.

    Also, when I change my code while the app is running, it does not auto-refresh the webpage, and I need to refresh it manually.

    Is there a way to do these already? If not, it would be a nice thing to add.

    bug 
    opened by PrashantSaikia 8
  • File upload progress bar not precise

    File upload progress bar not precise

    Note: For inquiries while using PyWebIO or questions that might be helpful to others, please consider moving to Discussions for posting.

    BUG Description Seems not a big deal but still wanna raise it here.

    I'm trying to upload a ~200MB file through the file_upload method, while the websocket_max_message_size has already been increased.

    The progress bar goes into 100% in seconds but the upload actually finishes in about 2~3 minutes (measured by the trigger of the validate function), which may confuse the user.

    I think the issue may be caused by the calculation method that only considers the file uploading procedure while misses the post-processing. https://github.com/wang0618/PyWebIO/blob/49761f7084d5edc278414631785be7046d3ac690/webiojs/src/session.ts#L235-L238

    Environment Information

    • OS and Version: Ubuntu 18.04
    • Browser and Version: Edge 88.0.705.29
    • Python Version: Python3.6.9
    • PyWebIO Version: 1.1.0
    bug 
    opened by lanyusea 8
  • [Feature Request] start_scriptmode server function

    [Feature Request] start_scriptmode server function

    Hey, pywebio is an awesome idea, thank you for that :)

    Thanks to corona im regularly working remotely over ssh, and when I want to toy around with data, I usually generate html files that contain plots and tables, copy them to my local machine, and open them here (sshfs has some quirks inside wsl2). I had hoped to be able to use pywebio instead, but when run in scripting mode, the server is always opened on another port. I thought, maybe I could just look at the port, in which it opens using the session.info, and then create a local port forwarding (so there would be two forwardings: my machine:8080 -> server:8080 and server:8080 -> wherever pywebio runs), im not sure, whether that would have worked, but I couldn't try, because pywebio would always open a browser on the server (lynx or w3m since no X), and then it would freeze on the first put_ function, probably because they rely on some feature the browser doesn't support. After uninstalling lynx and w3m, nothing changed. So what would be awesome for me, would be a function start_script_mode_server(port=8080, openBrowser=False) I first tried to add it myself, but the code base is too complex to understand it quickly (and web is not really my forte), and I can't read Chinese, which a lot of comments are in. If you would be willing to add this feature, that would be awesome.

    PS: sorry, I dont know how to remove the bug label

    opened by KnorrFG 8
  • Not able to Integrate with FastAPI

    Not able to Integrate with FastAPI

    As stated in Integration with web framework we can integrate PyWebIO with FastAPI but the current version of PyWebIO has no support to FastAPI. i have downloaded the latest version of PyWebIO==1.2.3 and FastAPI has already been downloaded https://imgur.com/a/mPbomhj

    opened by richylyq 7
  • Eval_js in non-coroutine inside run_async doesn't work

    Eval_js in non-coroutine inside run_async doesn't work

    BUG Description

    Running lol = run_async(eval_js("console.log('Hello'))) in a non-coroutine session doesn't work and it freezes and doesn't go on, so it executes nothing after it. No error, No nothing. The same also happens without run_async. run_js works.

    Environment Information

    • OS and Version: Manjaro, newest
    • Browser and Version: Brave/Firefox Dev edition
    • Python Version: 3.9.4
    • PyWebIO Version: 1.2.3.dev2105160323
    bug 
    opened by mawoka-myblock 7
  • Slider support?

    Slider support?

    Requesting a feature add - slider.

    For multi-parameter apps, a slider is a natural choice for many situations. Especially, it gives an idea about the range of values to experiment with.

    bug 
    opened by tirthajyoti 7
  • multiple routes

    multiple routes

    Hello again, what is the best and easiest way to have multiple routes app? Tried to use flask with app.add_url_rule() but for multiple routes got the error

    webio_view() can not be over write.

    Thanks

    opened by Shahin-rmz 7
  • How can I override the <head> tag for my page?

    How can I override the tag for my page?

    Hi, may I know is there a way I can add some more <script> tags inside the <head> section of the default HTML>?

    <!doctype html>
      | <html lang="">
      | <head>
      | <meta charset="UTF-8">
      | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
      | <title>Example</title>
      | <meta name="description" content="Foo bar">
      | <link rel="icon" type="image/png" sizes="32x32" 
     ...
      | <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/wang0618/[email protected]/css/toastify.min.css">
      | <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/wang0618/[email protected]/css/app.css">
      | </head>
     
    <body>
      | <div class="pywebio">
    
    opened by ngshiheng 7
  • AssertionError: Don't support application type:<class 'pywebio.io_ctrl.Output'>

    AssertionError: Don't support application type:

    Hi im having a problem with start_server(voting(), port = 80)

    Exception has occurred: AssertionError Don't support application type:<class 'pywebio.io_ctrl.Output'>

    this is my practice code :

    from pywebio import start_server from pywebio.input import * from pywebio.output import *

    def voting(): name = input('Enter your name', type=TEXT) age = input('Enter your age', type=NUMBER)

    if age >= 18:
        put_text('Check your details...')
        put_table([['Name','Age'],[name, age]])
    
        check = checkbox(options= ['All details are correct'])
    
        if check:
            selection = radio('Select your party', ['Congress','BJP','AAP'])
            put_text('Thanks, Your response has been recorded.')    
            keep_voting = radio('Keep voting', ['Yes', 'No'])
    
            if keep_voting == 'Yes':
                voting()
            else:
                return style(put_text('Voting has ended, We will announce the result soon...'),'color:green')
    else:
        style(put_text('Your not eligible for voting..'),'color:red')
    
        keep_voting = radio('Keep voting', ['Yes', 'No'])
    
        if keep_voting == 'Yes':
            voting()
        else:
            return style(put_text('Voting has ended, We will announce the result soon...'),'color:green')
    

    start_server(voting(), port = 80)

    opened by ausdito 6
  • doesn't work on python 3.10

    doesn't work on python 3.10

    BUG Description

    When I run the main.py in demo:

    ERROR:tornado.access:500 GET /index (127.0.0.1) 1.00ms ERROR:tornado.application:Uncaught exception GET /favicon.ico (127.0.0.1) HTTPServerRequest(protocol='http', host='127.0.0.1:8090', method='GET', uri='/favicon.ico', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Host': '127.0.0.1:8090', 'Connection': 'keep-alive', 'Sec-Ch-Ua': '"Not?A_Brand";v="8", "Chromium";v="108", "Microsoft Edge";v="108"', 'Sec-Ch-Ua-Mobile': '?0', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46', 'Sec-Ch-Ua-Platform': '"Windows"', 'Accept': 'image/webp,image/apng,image/svg+xml,image/,/*;q=0.8', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'no-cors', 'Sec-Fetch-Dest': 'image', 'Referer': 'http://127.0.0.1:8090/index', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'Cookie': 'auth=fdhbsiufgheiuyhfiusehfiuhuefsih'}) Traceback (most recent call last): File "C:\Users\小夜\AppData\Local\Programs\Python\Python310\lib\site-packages\tornado\web.py", line 1350, in _execute raise TypeError("Expected None, got %r" % result) TypeError: Expected None, got <coroutine object _webio_handler..WSHandler.get at 0x0000021EC3E8B840> ERROR:tornado.access:500 GET /favicon.ico (127.0.0.1) 1.00ms

    It can run on 3.6 with no error.

    Environment Information

    • OS and Version: windows , python 3.10
    bug 
    opened by Edint386 2
  • 组合输入操作触发 item_valid_funcs KeyError

    组合输入操作触发 item_valid_funcs KeyError

    BUG描述

    偶尔在单选(radio)函数出现 KeyError 异常,一般遇到后间隔几秒后刷新再次访问(使用 start_sever 开启的 Flask 视图)便可以恢复或者稍微慢点操作就不会遇到。

    此异常已经存在了相当长的一段时间,不过因为之前没太记录错误的详细信息,最近配置了相关 log 后,准确的捕捉到异常信息如下:

    Traceback (most recent call last):
      File "/home/admin/.local/lib/python3.11/site-packages/pywebio/session/threadbased.py", line 86, in main_task
        target()
      File "/home/admin/jserver.py", line 519, in jmm
        a = radio(
            ^^^^^^
      File "/home/admin/.local/lib/python3.11/site-packages/pywebio/input.py", line 424, in radio
        return single_input(item_spec, valid_func, lambda d: d, onchange_func)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/admin/.local/lib/python3.11/site-packages/pywebio/session/__init__.py", line 283, in inner
        return run_as_function(gen)
               ^^^^^^^^^^^^^^^^^^^^
      File "/home/admin/.local/lib/python3.11/site-packages/pywebio/utils.py", line 296, in run_as_function
        res = gen.send(res)
              ^^^^^^^^^^^^^
      File "/home/admin/.local/lib/python3.11/site-packages/pywebio/io_ctrl.py", line 260, in single_input
        data = yield input_control(spec=spec,
                     ^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/admin/.local/lib/python3.11/site-packages/pywebio/session/__init__.py", line 283, in inner
        return run_as_function(gen)
               ^^^^^^^^^^^^^^^^^^^^
      File "/home/admin/.local/lib/python3.11/site-packages/pywebio/utils.py", line 296, in run_as_function
        res = gen.send(res)
              ^^^^^^^^^^^^^
      File "/home/admin/.local/lib/python3.11/site-packages/pywebio/io_ctrl.py", line 283, in input_control
        data = yield input_event_handle(item_valid_funcs, form_valid_funcs, preprocess_funcs, onchange_funcs)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/admin/.local/lib/python3.11/site-packages/pywebio/session/__init__.py", line 283, in inner
        return run_as_function(gen)
               ^^^^^^^^^^^^^^^^^^^^
      File "/home/admin/.local/lib/python3.11/site-packages/pywebio/utils.py", line 296, in run_as_function
        res = gen.send(res)
              ^^^^^^^^^^^^^
      File "/home/admin/.local/lib/python3.11/site-packages/pywebio/io_ctrl.py", line 350, in input_event_handle
        check_item(onblur_name, event_data['value'], item_valid_funcs[onblur_name],
                                                     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
    KeyError: 'auth'
    

    主函数源代码经部分缩短后为:

    def main():
        auth = input_group("jserver", [input(label="输入一个数字", type=NUMBER, validate=lambda v: None, required = True, name = "auth")])
        a = radio(label="选择服务", required=True, value="dmm", options=[("写入列表", "write"), ("读入列表", "read")])
    
    start_server(main, 8888)
    

    就是这样的两个连续的简单输入(auth 虽然是 input_group 只有一个输入,但是也没有什么不可以大概),在 radio 行触发 KeyError

    我个人发现问题主要发生在 input_group 输入过快时,结合变量名来猜测,大概是在验证 auth 这一项 input 是否符合 validate 函数给出的要求时,auth 输入已经被丢掉了

    环境信息

    • 操作系统及版本: macOS、Debian 均偶尔发生
    • 浏览器及版本: Safari 桌面版和移动版均发生
    • Python版本: 从 Python 3.9 至 Python 3.11 均偶尔发生
    • PyWebIO版本: 从至少 1.5 版本就一直偶尔发生
    bug 
    opened by junyilou 3
  • Bump decode-uri-component from 0.2.0 to 0.2.2 in /webiojs

    Bump decode-uri-component from 0.2.0 to 0.2.2 in /webiojs

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • put_input datalist 兼容性问题

    put_input datalist 兼容性问题

    BUG描述 在部分浏览器上,使用 put_input 函数的 datalist 参数设置输入下拉提示无效。

    环境信息

    • 操作系统及版本: Android 12
    • 浏览器及版本: Android WebView latest / 微信内置浏览器
    • Python版本: Python 3.10.8
    • PyWebIO版本: PyWebIO 1.7.0

    希望能通过集成第三方插件的方式提升对手机浏览器的兼容性。

    bug 
    opened by FHU-yezi 0
🧮A simple calculator written in python allows you to make simple calculations, write charts, calculate the dates, and exchange currency.

Calculator ?? A simple calculator written in python allows you to make simple calculations, write charts, calculate the dates, and exchange currency.

Jan Kupczyk 1 Jan 15, 2022
Mini is a web browser application based on the Python PyQt web engine, made in 290 lines of code.

Mini Mini is a web browser application based on the Python PyQt web engine, made in 290 lines of code. The code is written and published as is, so the

Dmitry Karpenko 6 Nov 7, 2022
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
GlobalProtectGUI is a simple tray app to connect, disconnect and monitor globalprotect VPN connection.

Simple GlobalProtectGUI GlobalProtectGUI is simple tray app to connect, disconnect and monitor globalprotect VPN connection. Installation Required bef

Aleksandar Dostic 11 Oct 7, 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
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
PyQT5 app for LOLBAS and GTFOBins

LOLBins PyQT app to list all Living Off The Land Binaries and Scripts for Windows from LOLBAS and Unix binaries that can be used to bypass local secur

Hamza Megahed 41 Dec 1, 2022
The Python-Weather-App is a service that provides weather data

The Python-Weather-App is a service that provides weather data, including current weather data to the developers of web services and mobile applications.

Sayed Tabish 1 Dec 13, 2021
GUI app to read settings and stats from Cloudflare WARP CLI for Linux, and change some settings

warp-cli-gui GUI app to read settings and stats from Cloudflare WARP CLI for Linux, and change some settings. Description Python program that will int

Danie 6 Nov 1, 2022
Linux GUI app to codon optimize a directory with fasta files using taxonomy ids imported as a 1-column txt file (1 taxonomy id for each file)

codon optimize cds paired with taxids singlefastas gui Linux GUI app to codon optimize a directory with fasta files using taxonomy ids imported as a 1

Olga Tsiouri 1 Jan 9, 2022
A simple quiz app using API and GUI

GUI-Quiz-APP It's a simple quiz app using API and GUI.

KALPAK KUMAR DAS 1 Feb 3, 2022
GUI based app made in python using tkinter

Virtual Keyboard A GUI application made in python using tkinter This is my first ever proper GUI based application project after learning tkinter rece

AbhineetK 10 Dec 10, 2022
EZ Presence - A GUI-Python app which makes it easy to set a custom Discord Rich Presence. (BETA)

EZ Presence EZ Presence is a GUI-Python app which makes it easy to set any custom Discord Rich Presence. Using the App How to Run Since the app is in

notsniped 2 Mar 1, 2022
🏆 A ranked list of awesome python libraries for web development. Updated weekly.

Best-of Web Development with Python ?? A ranked list of awesome python libraries for web development. Updated weekly. This curated list contains 540 a

Machine Learning Tooling 1.8k Jan 3, 2023
Textual is a TUI (Text User Interface) framework for Python inspired by modern web development.

Textual is a TUI (Text User Interface) framework for Python inspired by modern web development.

Will McGugan 17.1k Jan 8, 2023
Web-Broswer simple using PyQt5 tools

Web-Broswer Simple web broswer made using PyQt Completely simple and easy to use How to set it up git clone https://github.com/AsjadOooO/Web-Broswer.g

Asjad 3 Nov 13, 2021
A simple, yet powerful web GUI to manage your Wireguard server, powered by Flask.

Linguard Linguard aims to provide a clean, simple yet powerful web GUI to manage your WireGuard server, and it's powered by Flask. Read the docs for f

Jose Antonio Mazón San Bartolomé 111 Jan 7, 2023
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
A python Script For Taking Screenshot Of Windows

PyShot A Python Script For Taking Screenshot Of Windows Disclaimer This tool is for educational purposes only ! Don't use this to take revenge I will

Nazim Cp 2 Jun 22, 2022