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.

Comments
  • 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
  • Enaml qt6 fixes (for deprecated methods)

    Enaml qt6 fixes (for deprecated methods)

    I discovered all of these issues when testing with the desktop example.

    I have started testing against my application (psiexperiment) and may have more to report later.

    Examples to check

    • [ ] aliases
    • [ ] applib
    • [ ] dynamic
    • [ ] functions
    • [ ] layout
    • [ ] stdlib
    • [ ] styling
    • [ ] templates
    • [ ] tutorial
    • [x] widgets
    • [ ] workbench

    Broken examples

    • [ ] drag_and_drop.enaml (drag and drop broken)
    • [ ] file_dialog.enaml (browse button broken)
    • [ ] flow_area.enaml (changing flow layout)
    • [ ] image_view.enaml (set to None)
    • [ ] ipython_console.enaml (possibly just need to install qtconsole),
    • [ ] vtk_canvas.enaml (most likely need to install vtk)
    • [ ] web_view.enaml
    opened by bburan 21
  • 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 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
  • 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
  • [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 14
  •  Create enaml-compileall for generating .pyc and .enamlc files

    Create enaml-compileall for generating .pyc and .enamlc files

    Adds an enaml-compileall command that patches python's compileall to also compile enaml files.

    Python 3 has legacy and optimize flags that are not used. https://github.com/python/cpython/blob/3.6/Lib/compileall.py#L95

    opened by frmdstryr 14
  • 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
  • Support Python 3.8

    Support Python 3.8

    Python 3.8 introduced many changes to the bytecode. This PR will focus on addressing them and allow to run enaml on Python 3.8 using Python 3.7 syntax. New syntax introduced in Python 3.8 will be the focus of a different PR.

    The first step (completed) towards supporting Python 3.8 is to switch from byteplay to bytecode (more modern interface and actively maintained) since Python 3.8 introduce once again many changes to the bytecode.

    The code requires ~https://github.com/vstinner/bytecode master~ bytecode 0.10.0 and pass all the tests on Python 3.8, 3.7 and 3.6. ~The next step is to adapt for Python 3.8.~

    opened by MatthieuDartiailh 13
  • RuntimeError: Failed to disconnect signal lostFocus().

    RuntimeError: Failed to disconnect signal lostFocus().

    With enaml 0.8.0 (2b2dfd6050b5190d1a251446b1c9dfc69b640525) and atom 0.3.3 (6dcf3e411bfc7ebb2ee8faffa7c1a0d5ab85b99b), and using the version of PySide in the latest anaconda, many of the examples raise a RuntimeError. E.g.

    $ enaml-run form.enaml 
    Traceback (most recent call last):
      File "/home/warren/local_enaml/bin/enaml-run", line 9, in <module>
        load_entry_point('enaml==0.8.0', 'console_scripts', 'enaml-run')()
      File "/home/warren/local_enaml/lib/python2.7/site-packages/enaml-0.8.0-py2.7-linux-x86_64.egg/enaml/runner.py", line 64, in main
        window.show()
      File "/home/warren/local_enaml/lib/python2.7/site-packages/enaml-0.8.0-py2.7-linux-x86_64.egg/enaml/widgets/window.py", line 331, in show
        self.activate_proxy()
      File "/home/warren/local_enaml/lib/python2.7/site-packages/enaml-0.8.0-py2.7-linux-x86_64.egg/enaml/widgets/toolkit_object.py", line 206, in activate_proxy
        child.activate_proxy()
      File "/home/warren/local_enaml/lib/python2.7/site-packages/enaml-0.8.0-py2.7-linux-x86_64.egg/enaml/widgets/toolkit_object.py", line 206, in activate_proxy
        child.activate_proxy()
      File "/home/warren/local_enaml/lib/python2.7/site-packages/enaml-0.8.0-py2.7-linux-x86_64.egg/enaml/widgets/toolkit_object.py", line 203, in activate_proxy
        self.activate_top_down()
      File "/home/warren/local_enaml/lib/python2.7/site-packages/enaml-0.8.0-py2.7-linux-x86_64.egg/enaml/widgets/toolkit_object.py", line 219, in activate_top_down
        self.proxy.activate_top_down()
      File "/home/warren/local_enaml/lib/python2.7/site-packages/enaml-0.8.0-py2.7-linux-x86_64.egg/enaml/qt/qt_toolkit_object.py", line 68, in activate_top_down
        self.init_widget()
      File "/home/warren/local_enaml/lib/python2.7/site-packages/enaml-0.8.0-py2.7-linux-x86_64.egg/enaml/qt/qt_field.py", line 78, in init_widget
        self.set_submit_triggers(d.submit_triggers)
      File "/home/warren/local_enaml/lib/python2.7/site-packages/enaml-0.8.0-py2.7-linux-x86_64.egg/enaml/qt/qt_field.py", line 168, in set_submit_triggers
        widget.lostFocus.disconnect(handler)
    RuntimeError: Failed to disconnect signal lostFocus().
    
    PySide bug 
    opened by WarrenWeckesser 13
  • Add python 3.11 support

    Add python 3.11 support

    This updates the code generator/compiler to work with Python 3.11, it builds on the pegen branch because the main branch just fails due to invalid col offsets in the ast.

    • It seems like the python docs are wrong with MAKE_FUNCTION as there is now no need to push a qualname (https://github.com/python/cpython/issues/93270).
    • Since POP_BLOCK was removed, I'm not sure if try_squash_raise can still be implemented?
    • There is still a weird problem with decl funcs with default args. Inspect shows the signature is correct and funchelper shows the correct number of defaults but for some reason it does not use the defaults?

    On a positive note I get about a 10-15% speedup with this on enaml-web :).

    opened by frmdstryr 1
  • [DOC] How to change mouse cursor to

    [DOC] How to change mouse cursor to "busy" state and back ?

    This there a wait to do this "natively" from within Enaml :

    https://stackoverflow.com/questions/8218900/how-can-i-change-the-cursor-shape-with-pyqt

    opened by Kochise 2
  • Generate .pyi files for enaml files

    Generate .pyi files for enaml files

    .enaml files appear completely opaques to most tools and while we cannot do much in a generic sense we could improve the user experience inside Python files using definition found in an enaml file by providing .pyi for enaml files.

    The generation could be made from the AST generated by the parser:

    • for Python blocks we could empty the body of function nodes and simply unparse the AST (auto formatting after could handle messed up line numbers)
    • for enamldef we could use a class and generate type annotations for attr, aliases, and event and copy the annotations of declarative func. For attr, enaml syntax already has a type annotation, for aliases we would need to resolve to what the alias point to and if it is an atom member we should recover the matching type useful in an annotation, for event we would simply use the atom member
    • for template something similar could work too but it will need more thoughts
    opened by MatthieuDartiailh 0
  • Tutorials are incomplete

    Tutorials are incomplete

    I just downloaded Enaml and am trying to follow the Person tutorial, but it's incomplete. It doesn't tell me how to name the files or how to run them, so I just get an error like this:

    14:34:02 $ enaml-run lala.enaml
    Could not find component 'Main'
    

    In my opinion, tutorials should assume zero knowledge on the part of the reader, so the tutorial should tell me the names of the files and the command I need to see the UI.

    opened by skorokithakis 5
  • Show declarative stack if an error occurs during initialization or change event

    Show declarative stack if an error occurs during initialization or change event

    For #493 . It works by saving a reference to the compiler node to each declarative object and copies the filename and line number during compilation.

    Unfortunately this breaks any existing caches because of the additional parameters, I'm not sure what to do about that, it could maybe provide empty defaults for the filename and lineno?

    Also it currently doesn't catch errors when manually updating an expression, eg so I'm not sure if it should be doing a try/except in the expression engine itself.

    opened by frmdstryr 20
Releases(0.15.2)
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
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 115 Dec 24, 2022
FPKG Maker GUI - A user friendly User Interface for fPKG Tools for PS4

Know Issues being worked on Please place this application on the root of a drive

null 26 Nov 27, 2022
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 9.4k Jan 4, 2023
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 9.4k Jan 7, 2023
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 17.1k Jan 4, 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
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
Function-Plotter - GUI Python program that plots functions that are entered by the user

FunctionPlotter GUI Python program that plots functions that are entered by the user. The program takes minimum and maximum value for x and plot it as

Mohamed Magdy 2 Jan 20, 2022
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 1, 2022
Kivy is an open source Python framework for creating cross-platform multi-touch mobile applications with Natural User Interface.

Kivy is an open source Python framework for creating cross-platform multi-touch mobile applications with Natural User Interface.

Grace Ugochi Nneji 3 Feb 15, 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

null 20 Aug 24, 2022
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
PyQt QGraphicsView with selection box. User can move vertical border of the box horizontally.

pyqt-horizontal-selection-square-graphics-view PyQt QGraphicsView with selection box. User can move vertical border of the box horizontally. Requireme

Jung Gyu Yoon 3 Nov 7, 2022
GUI to enable user selection of measurement and station in kHTConnector module.

kHTGui GUI to enable user selection of measurement and station in kHTConnector module. Helper tool for PowerBI users If you're planning to import data

kk 1 Jan 26, 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
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 5.4k Jan 7, 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