Declarative User Interfaces for Python

Overview

Welcome to Enaml

Build Status Appveyor Build Status Code Coverage Status Documentation Status PyPI version

Enaml is a programming language and framework for creating professional-quality user interfaces with minimal effort.

What you get

  • A declarative programming language, with a Pythonic flavour.
  • Dozens of widgets, ready to go out-of-the-box (built on Qt).
  • A constraints-based layout engine (built on Kiwi).
  • Integration with a data model tool (built on Atom).
  • An (optional) editor to allow you to see what the results will look like, as you type your code.
  • A well-documented and easy-to-follow code base, plus documentation with plenty of worked examples.
  • Language definitions for a number of popular editors.

What it can do for you

  • Build native GUI applications for a range of platforms
    • Quick and simple or complex and specialised.
    • See the structure of your GUI at a glance.
  • Let you rapidly protoype new GUIs interfaces.
    • Intelligently layout your GUI, using symbolic constraints.
    • It automatically adapts for different platforms, different window sizes.
    • Tell the layout engine what your priorities are for layout, without having to count pixels.
  • Encourages easy-to-maintain code:
    • The GUI can detect updates in the model, and refresh its widgets automatically, without low-level code.
    • Clean separation between your model and view, while keeping your controller code simple.
      • You can incorporate Python code directly in the view layer.
      • As your GUI design evolves, the constraints engine can adapt the layout.
      • Object-Oriented design allows you to reuse parts of your GUI in other parts of your projects.
  • Let you customise a GUI for your particular needs.
    • Integrates with your Python code.
    • Include style-sheets to change the appearance across all, or part, of your application quickly.
    • Extend the available widgets or build your own.

Supported Versions

Enaml applications can be run on any platform which supports Python (3.6+). The Qt backend requires Qt (5.9+, see https://doc.qt.io/qt-5/supported-platforms.html).

This includes Linux, Windows, MacOSX, Android and iOS. (Automated testing of Enaml runs on Linux, Windows and MacOSX.)

Enaml is licensed under the Modified BSD License.

Learn More

The Getting Started chapter is a good first step to learn more. It includes installation instructions.

Watch some introductory talks about Enaml and what it can do:

https://img.youtube.com/vi/ycFEwz_hAxk/2.jpg

S. Chris Colbert (@sccolbert) presents at Enthought 2012.

https://img.youtube.com/vi/G5ZYUGL7uTo/1.jpg

Tom Stordy-Allison (@tstordyallison) presents at Pycon UK 2016.

The Enaml documentation includes all the details, including useful examples.

You can ask questions on the Enaml Google Group or with the Enaml tag on StackOverflow.

For version information, see the release notes.

Examples

The Enaml documentation includes many fully-functioning code samples of how to use Enaml. They range from simple demonstrations of how a widget is used, to advanced explorations of the customisability of Enaml GUIs.

Employee Tutorial

The Employee Tutorial shows how constraints and validators can be used to create easy-to-use and professional-looking applications:

http://enaml.readthedocs.io/en/latest/_images/tut_employee_layout.png

Button Ring

The Button Ring Example goes the other way. The result is neither professional-looking nor easy-to-use, but it shows the power and flexibility of constraints-based layout - it might be silly, but this could not be achieved with typical layout systems.

http://enaml.readthedocs.io/en/latest/_images/ex_button_ring.png

Dock Item Alerts

The Dock Item Alerts Example shows some of the customisability of the appearances of an Enaml application. This application's appearance is based on Visual Studio 2010 style, with dockable items, but has some customisations based on the importance of the alerts being shown.

http://enaml.readthedocs.io/en/latest/_images/ex_dock_item_alerts.png

Check out the documentation for more examples.

Issues
  • Python 3

    Python 3

    any plans to make it Python 3 compatible?

    opened by zaufi 61
  • Add subscription block

    Add subscription block

    Well that was easy.

    opened by frmdstryr 38
  • Documentation improvements.

    Documentation improvements.

    The main change here is the addition of a new example file, which demonstrates how the various date-related widgets look and work, and documentation to match.

    While doing that work, I made a number of other more minor changes, including reducing the Sphinx warnings, which included exposing another example that had been hidden.

    opened by Julian-O 22
  • Using Enaml for mobile apps

    Using Enaml for mobile apps

    I've been playing around with trying to use Enaml for creating mobile apps (see enaml-native) in python using native widgets. It is working, however loading enaml is awful slow (takes over 8 seconds on a Nexus 5) which is pretty much a killer for the whole concept.

    After some investigation this is due to the yacc.yacc call in enaml/core/parser.py#L3984 taking almost 8 seconds to complete. (There's also jnius.autoclass taking forever but I'm working on that as well)

    
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:          1124963 function calls (1115859 primitive calls) in 22.236 seconds
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:    Ordered by: cumulative time
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:        33   10.232    0.310   12.482    0.378 /data/user/0/com.jventura.pyapp/assets/python/site-packages/jnius/reflect.py:149(autoclass)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.000    0.000   11.285   11.285 /data/user/0/com.jventura.pyapp/assets/python/bootstrap.py:22(router)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.000    0.000   11.285   11.285 /data/user/0/com.jventura.pyapp/assets/python/bootstrap.py:33(handle)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.000    0.000   11.285   11.285 /data/user/0/com.jventura.pyapp/assets/python/bootstrap.py:100(start)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.008    0.008   11.285   11.285 /data/user/0/com.jventura.pyapp/assets/python/enamlnative/android/app.py:51(start)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.000    0.000   11.277   11.277 /data/user/0/com.jventura.pyapp/assets/python/enamlnative/android/app.py:60(get_view)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:      25/1    0.001    0.000   10.954   10.954 /data/user/0/com.jventura.pyapp/assets/python/site-packages/enaml/widgets/toolkit_object.py:147(initialize)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:        25    0.001    0.000   10.952    0.438 /data/user/0/com.jventura.pyapp/assets/python/site-packages/enaml/application.py:351(create_proxy)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:        25    0.000    0.000   10.951    0.438 /data/user/0/com.jventura.pyapp/assets/python/site-packages/enaml/application.py:325(resolve_proxy_class)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:        30    0.000    0.000   10.950    0.365 /data/user/0/com.jventura.pyapp/assets/python/site-packages/enaml/application.py:127(resolve)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:      25/1    0.001    0.000    9.258    9.258 /data/user/0/com.jventura.pyapp/assets/python/site-packages/enaml/core/declarative.py:103(initialize)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.022    0.022    8.264    8.264 /data/user/0/com.jventura.pyapp/assets/python/site-packages/enaml/__init__.py:36(imports)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.115    0.115    8.243    8.243 /data/user/0/com.jventura.pyapp/assets/python/site-packages/enaml/core/import_hooks.py:8(<module>)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.090    0.090    8.023    8.023 /data/user/0/com.jventura.pyapp/assets/python/site-packages/enaml/core/parser.py:8(<module>)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.005    0.005    7.719    7.719 /data/user/0/com.jventura.pyapp/assets/python/site-packages/ply/yacc.py:3214(yacc)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.001    0.001    6.869    6.869 /data/user/0/com.jventura.pyapp/assets/python/site-packages/ply/yacc.py:2100(__init__)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.690    0.690    6.523    6.523 /data/user/0/com.jventura.pyapp/assets/python/site-packages/ply/yacc.py:2533(lr_parse_table)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.000    0.000    3.958    3.958 /data/user/0/com.jventura.pyapp/assets/python/site-packages/ply/yacc.py:2509(add_lalr_lookaheads)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    1.812    1.812    1.816    1.816 /data/user/0/com.jventura.pyapp/assets/python/site-packages/ply/yacc.py:2283(find_nonterminal_transitions)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:     53114    1.332    0.000    1.804    0.000 /data/user/0/com.jventura.pyapp/assets/python/site-packages/ply/yacc.py:2163(lr0_goto)
    05-26 12:30:49.509 19789-19789/com.jventura.pyapp I/pybridge:         1    0.007    0.007    1.696    1.696 /data/user/0/com.jventura.pyapp/assets/python/enamlnative/android/factories.py:103(drawer_layout_factory)
    more excluded ...
    
    

    Does enaml require the use of ply? Could some alternative be used? If not, I've been thinking about cythonizing ply, but before going that far I thought I'd check here and see if that would even work.

    Thanks!

    opened by frmdstryr 20
  • Python 3.8 support

    Python 3.8 support

    This is a meta to track the changes associated with Python 3.8:

    Required changes (meaning enaml won't run without them):

    • bytecode changes:
      • MAP_ADD: the expected order on the TOS changed
      • BREAK_LOOP, CONTINUE_LOOP, SETUP_LOOP, SETUP_EXCEPT have been removed and as a consequence the code_generator for_loop and try_squash_raise need to be updated.
      • ROT_FOUR, BEGIN_FINALLY, CALL_FINALLY, POP_FINALLY have been added which may impact try_squash_raise.
      • END_FINALLY and WITH_CLEANUP_START changed of behavior
      • CodeType signature changed

    Those require to update wbyteplay and in particular the stack trace calculation and since we will be dropping Python 2 it may be the proper time to switch to https://github.com/vstinner/bytecode which a more modern interface to the Python bytecode.

    Other changes (required for feature parity with normal Python):

    • support for assignment expression (may cause grammar issue, and is tightly related to https://github.com/nucleic/enaml/pull/348)
    • positional only argument (change to the parser but should not be a big problem, except it may mean the AST for function may have change which would imply more pervasive changes)
    • f-strings now have a new formatting mode marked by '='
    • continue is now allowed in finally clause (not sure we were actively preventing it on the parser side)
    • the rules for unpacking in yield and return have changed.
    opened by MatthieuDartiailh 19
  • Add themes, autocomplete, markers, indicators, and show_line_numbers to scintilla

    Add themes, autocomplete, markers, indicators, and show_line_numbers to scintilla

    Preview image

    Themes are parsed and generated from http://richleland.github.io/pygments-css/

    opened by frmdstryr 15
  • Zipimports

    Zipimports

    I'm not sure why but git made me commit my other changes so this also includes adding autocomplete to the scintilla widget.

    I can break it apart if needed.

    opened by frmdstryr 15
  • Add CloseEvent to DockItem

    Add CloseEvent to DockItem

    This will allow DockItem widgets to perform an action in response to the titlebar close button being clicked (and ignore this event if desired).

    opened by bburan 15
  • Add button group widget

    Add button group widget

    This is a proxy for Qt's QButtonGroup class, which allows manual management of button groupings. This alleviates the restriction of requiring all buttons to be within the same container to ensure that only one button in the desired grouping can be selected at a time.

    I don't think this is ready to merge in its current state. The requirement to manually hook up the button to the button group in the 'activated' event handler is very clunky, but I'm not sure at present of a better way of handling this.

    I'm also not sure that it makes sense to have the button group as an actual widget, but I wasn't sure of a better way to handle this either. The Timer widget (a proxy for the QTimer class) appears to work in the same way that this patch currently does.

    I'm pretty sure there is some other documentation that needs updating, such as anything that claims the only way to implement exclusitivity is through a common container parent. I'd appreciate some guidance on this, and on if any additional testing is required.

    I also wanted to say thank you for such an amazing piece of work. I found Enaml just three weeks ago, and it's been an absolute joy to work with. I didn't think it was possible for desktop application development to be so easy and fun. I know a large part of the software development industry is moving towards the web, but there are absolutely still plenty of important use cases where a desktop application makes more sense, so it's very nice to see toolkits like this still being developed.

    opened by djmattyg007 15
  • Python 3 listcomp not updating

    Python 3 listcomp not updating

    I'm trying to filter a table, however this simple example is not working in python3 (on the current master branch).

    
    from enaml.widgets.api import Window, Container, Label, Field
    
    
    enamldef Main(Window):
        Container:
            attr colors = ['red', 'blue', 'yellow', 'green']
            Field: search:
                placeholder = "Search..."
            Label:
                text << '{}'.format(search.text)
            Label:
                text << '{}'.format([c for c in colors
                                        if not search.text or search.text in c])
    
    

    The second Label displays correctly initially but never updates thereafter. The first Label works as expected. Both work fine in Python 2.7.

    I tried a few more and it seems to be only with generator expressions on the RHS, so pulling the filtering out into a function is a workaround (and maybe a better to do it anyways).

    
    from enaml.widgets.api import Window, Container, Label, Field
    
    STATIC_COLORS = ['red', 'blue', 'yellow', 'green']
    
    def echo(text):
        return text
    
    def echo_gen(text):
        return [text for i in range(3)]
    
    def echo_global(text):
        return [c for c in STATIC_COLORS if text in c]
    
    def echo_ref(text, colors):
        return [c for c in colors if text in c]
    
    enamldef Main(Window):
        Container: container:
            attr colors = ['red', 'blue', 'yellow', 'green']
            Field: search:
                placeholder = "Search..."
    
            Label: t1:
                #: Works
                text << '{}'.format(search.text)
    
            Label: t2:
                #: Works
                text << '{}'.format([search.text])
    
            Label: t3:
                #: Works
                text << '{}'.format(echo(search.text))
            Label: t4:
                #: Works
                text << '{}'.format(echo_gen(search.text))
            Label: t5:
                #: Works
                text << '{}'.format(echo_global(search.text))
            Label: t6:
                #: Works
                text << '{}'.format(echo_ref(search.text, colors))
            Label: t7:
                #: Doesn't update in 2.7 (master) OR 3.5
                text << '{}'.format({i:search.text for i in range(3)})
            Label: t8:
                #: Doesn't update in 3.5
                text << '{}'.format([search.text for i in range(3)])
            Label: t9:
                #: Doesn't update in 3.5
                text << '{}'.format([c for c in colors
                                        if not search.text or search.text in c])
    
    

    The dict one is not working in 2.7 or python 3 (master branch). Interestingly, if I use enaml==0.9.8 it won't run unless that's commented out (gives a NameError: global name 'search' is not defined) so I assume dict comps never were supported.

    opened by frmdstryr 14
  • Add examples gallery

    Add examples gallery

    To quickly find what it looks like

    opened by Kochise 2
  • Fix default module path

    Fix default module path

    Some examples requires it somehow

    opened by Kochise 2
  • [DOC] How to set the size of a Widget ?

    [DOC] How to set the size of a Widget ?

    I have a MPLCanvas I'd like to reshape at runtime and the whole parent Window to resize accordingly, how is it possible ?

    All what've found so far is Window.set_size() but I need the MPLCanvas child to have a specific size instead.

    https://enaml.readthedocs.io/en/latest/api_ref/widgets/window.html?highlight=size#enaml.widgets.window.Window.set_size

    opened by Kochise 5
  • Example fixes

    Example fixes

    The second is not interesting I just took the occasion to do some cleanup.

    opened by MatthieuDartiailh 1
  • [FEAT] Translation like Style ?

    [FEAT] Translation like Style ?

    Could there be a way to add translation capability, just like styling widgets ?

    enamldef MyLocales(Locales):
    	json = "translations.json"
    	Locale:
    		name = "French - France"
    		lcid = "fr-fr"
    		Translation:
    			object_name = "lbl_def"
    			text = "Texte par défaut"
    	Locale:
    		name = "German - Germany"
    		lcid = "de-de"
    		Translation:
    			object_name = "lbl_def"
    			text = "Standardtext"
    		Translation:
    			name = "str_out_of"
    			text = "{} aus {}"
    	Locale:
    		name = "Latvian"
    		lcid = "lv"
    		Translation:
    			from = "Default text"
    			text = "Noklusejuma teksts"
    
    enamldef Main(Window):
    	title = 'Translation test'
    	locale << my_loc.lcid_of(sel_loc.selected)
    	MyLocales: my_loc:
    		pass
    	Container:
    		padding = 0
    		constraints = [vbox(lbl_def, sel_loc)]
    		Label: lbl_def:
    			text = "Default text"
    		ObjectCombo: sel_loc:
    			items = my_loc.locales()
    			selected = my_loc.name_of("fr-fr")
    

    The idea would be to provide either a JSON file containing basically the same structure, or specific translation (from widget's name) or generic translation (from widget's initial text, imply caching the original text). Setting locale to None indeed display the original text.

    Now the question remains how to identify properly each locale, I think the LCID is best because universal, while the name also needs to be translated as well : https://www.loc.gov/standards/iso639-2/php/code_list.php

    You can find locales identifiers here : https://www.science.co.il/language/Locale-codes.php / https://ss64.com/locale.html

    https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes / https://iso639-3.sil.org/code_tables/639/data

    Another question would be how to translate things like formatting strings (like "{} out of {}") easily. Maybe a my_loc.get_string('str_out_of') would do the trick.

    opened by Kochise 3
  • [BUG] Non working examples ?

    [BUG] Non working examples ?

    Hi, just trying the example files, yet some are acting "weird" :

    enaml-main\examples\styling\banner.enaml

    The dark gradient is way too dark to see it is actually a gradient. Use this instead :

    'stop: 0 #1356A9, stop: 0.3 #8AAFDC, stop: 0.58 #E0E4E0, stop: 0.68 #F8D8B1, stop: 0.848 #D39B8A, stop: 0.8499 #9C7F73, stop: 0.85 #D79F88, stop: 0.851 #E2BF9B, stop: 1 #817F73)'

    enaml-main\examples\templates\basic.enaml

    ok_clicked and cancel_clicked are obviously not handled like intended, nothing is printed into the console.

    enaml-main\examples\widgets\buttons.enaml

    While selecting RadionButton from the second container (two lowest radios) you can unselect radios from the first container.

    enaml-main\examples\widgets\dual_slider.enaml

    Sliders' tab are way too tiny :

    slider_tabs

    enaml-main\examples\widgets\file_dialog.enaml

    The file dialog opens relatively to its parent window (or not, even when parent=None). How is it possible to open the dialog always on screen which is the parent window yet centered ? Or best, save its position and last path for next time.

    enaml-main\examples\widgets\flow_area.enaml

    Item(FlowItem).Html doesn't show up until 'Ortho Stretch' is at least 1 and up or 'Preferred Height' is at least 173 and up.

    enaml-main\examples\widgets\image_view.enaml

    The motion of the ImageView is pretty weird because related of the spacer's width. Even if the window's height is high enough, if its width is narrowed the image goes up.

    enaml-main\examples\widgets\mdi_area.enaml

    Tiling : get 3 mdi windows, tile them, move the top left and top right around, tile them again, the title bar of the top right window is not redrawn correctly.

    Cascading : get 3 mdi windows, cascade them, move the top left one around, cascade them again, the middle one gets buried. I mean, the position should be set to top alternatively so that we can read every title bar like the first time. Btw, is there a way to define the horizontal and vertical spacing of the tiled windows ?

    mdi_area

    enaml-main\examples\layout\basic\stack.enaml

    Maybe there should be one.

    enaml-main\examples\tutorial\plugin\plugin.enaml

    Maybe there should be one.

    enaml-main\examples\tutorial\scintilla\scintilla.enaml

    Maybe there should be one.

    opened by Kochise 13
  • try running Qt tests on 3.10 using pyside 2

    try running Qt tests on 3.10 using pyside 2

    null

    opened by MatthieuDartiailh 0
  • How do you package/distribute an enaml application?

    How do you package/distribute an enaml application?

    I built a simple app using enaml called date range chunker. I want to share it with others who won't have python installed in their system.

    What is the recommended approach to packaging/distributing my application to people using windows. I tried to make use of pyinstaller but every time I try to start the app it fails. It is not able to execute the dynamic import of the .enaml files via the enaml.imports() context manager.

    opened by OdinTech3 8
  • .enamlc files are nondeterministic

    .enamlc files are nondeterministic

    While working on reproducible builds for openSUSE, I found that our python-enaml 0.10.4 package varies from nondeterministic bits in .enamlc files.

    /usr/lib64/python3.7/site-packages/enaml/workbench/ui/__enamlcache__/workbench_window.enaml-py37-cv26.enamlc differs at offset '655' 
    -00000280  20 da 0b 6d 61 6b 65 5f  6f 62 6a 65 63 74 63 01  | ..make_objectc.|
    +00000280  20 da 0b 6d 61 6b 65 5f  6f 62 6a 65 63 74 e3 01  | ..make_object..|
     00000290  00 00 00 00 00 00 00 03  00 00 00 0f 00 00 00 43  |...............C|
    

    The entropy in there seems to only be 1 bit, so in 50% of the cases, 2 builds randomly have identical results. However, it should be easy to do 10 force-compiles of the relevant source like this:

    for i in $(seq 1 10) ; do
       $FORCECOMPILE
       md5sum $ENAMLCFILE
    done | sort | uniq -c
    

    If everything was good, there should just be 1 line with 10 counts of the same md5.

    See also https://reproducible-builds.org/ for why deterministic program behaviour is good.

    opened by bmwiedemann 3
Releases(0.14.0)
A library for building modern declarative desktop applications in WX.

re-wx is a library for building modern declarative desktop applications. It's built as a management layer on top of WXPython, which means you get all the goodness of a mature, native, cross-platform UI kit, wrapped up in a modern, React inspired API.

Chris 92 Nov 18, 2021
Dear PyGui: A fast and powerful Graphical User Interface Toolkit for Python with minimal dependencies

(This library is available under a free and permissive license however, if you Enjoy Dear PyGui please consider becoming a Sponsor) Dear PyGui is a si

Jonathan Hoffstadt 6.5k Dec 1, 2021
Dear PyGui: A fast and powerful Graphical User Interface Toolkit for Python with minimal dependencies

(This library is available under a free and permissive license however, if you Enjoy Dear PyGui please consider becoming a Sponsor) Dear PyGui is a si

Jonathan Hoffstadt 6.5k Dec 2, 2021
Rich.tui is a TUI (Text User Interface) framework for Python using Rich as a renderer.

rich.tui Rich.tui is a TUI (Text User Interface) framework for Python using Rich as a renderer. The end goal is to be able to rapidly create rich term

Will McGugan 6.3k Dec 1, 2021
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 6.2k Nov 28, 2021
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

null 21 Nov 23, 2021
Advanced Zola Cabs integrated with tkinter Graphical User Interface (GUI) made for ZOHO Corp .

ZolaCabs Advanced Zola Cabs integrated with tkinter Graphical User Interface (GUI) made for ZOHO Corp. < Logs > username : zoho password : zoho [ Deve

Mastermind 9 Nov 18, 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 34 Oct 8, 2021
Python Screen Recorder using Python

PY-Screen-Recorder Python Screen Recorder using Python Requirement: pip install cv2 pip install pyautogui pip install numpy How to reach me? You can r

SonLyte 8 Nov 8, 2021
A little Python library for making simple Electron-like HTML/JS GUI apps

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

Chris Knott 4.7k Dec 1, 2021
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 2.8k Nov 24, 2021
Turn (almost) any Python command line program into a full GUI application with one line

Gooey Turn (almost) any Python 2 or 3 Console Program into a GUI application with one line Support this project Table of Contents Gooey Table of conte

Chris 15.1k Dec 2, 2021
pyglet is a cross-platform windowing and multimedia library for Python, for developing games and other visually rich applications.

pyglet pyglet is a cross-platform windowing and multimedia library for Python, intended for developing games and other visually rich applications. It

null 985 Dec 3, 2021
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 2.6k Nov 30, 2021
A Python native, OS native GUI toolkit.

Toga A Python native, OS native GUI toolkit. Prerequisites Minimum requirements Toga requires Python 3. Python 2 is not supported. If you're on macOS,

BeeWare 2.8k Dec 2, 2021
PyCG: Practical Python Call Graphs

PyCG - Practical Python Call Graphs PyCG generates call graphs for Python code using static analysis. It efficiently supports Higher order functions T

Vitalis Salis 99 Dec 2, 2021
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 52 Nov 23, 2021
🏆 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.4k Nov 25, 2021