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)
Firefox 96 Webapps for Gnome 3

mozapp Do you prefer Firefox to Chrome? Me too! But ever since Firefox dropped support for standalone web applications, I've resorted to using Chrome

Marten de Vries 8 Oct 31, 2022
Projeto de mini-games de azar com interface gráfica utilizando Python e PySimpleGui.

Gambling Mini jogos de azar unidos em uma mesma interface gráfica, utilizando a linguagem de programação Python em conjunto com a biblioteca de interf

Clayton Garcia da Silva 3 Nov 19, 2021
LyricsGenerator - A simple GUI made using Python(Tkinter) for generating song lyrics

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

Somya Ranjan Sahu 3 Mar 25, 2022
All you need to learn Tkinter!

Tkinter This repository contains the codes and resources which I used to learn the standard GUI library of Python, Tkinter! Best Tkinter Resources Vid

Samyak Jain 3 May 02, 2022
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 08, 2023
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

1.3k Jan 01, 2023
Advanced GUI Calculator with Beautiful UI and Clear Code.

Advanced GUI Calculator with Beautiful UI and Clear Code.

Mohammad Dori 3 Jul 15, 2022
Management Gui for OpenVR FSR PlugIn

OpenVR FSR App Small GUI to install/uninstall, tweak settings of the Modified OpenVR DLL with AMD FidelityFX SuperResolution Upscaler with a single cl

Stefan Tapper 234 Dec 20, 2022
Project made in Qt Designer + Python, for evaluation in the subject Introduction to Programming in IFPE - Paulista campus.

Project made in Qt Designer + Python, for evaluation in the subject Introduction to Programming in IFPE - Paulista campus.

Paola Rodrigues 2 Apr 13, 2022
This is a rip off of the classical iPhone Calculator . This project has been made with PyQT5

iPhoneCalcRIP-OFF This is a rip off of the classical iPhone Calculator . This project has been made with PyQT5

Juss Patel 7 May 01, 2022
Aplicação GUI feita em Python para estudos de cadastro (forms).

Cadastro de DEVs GUI 💻 A ideia original veio do repositório do https://github.com/PedroTomazeti nomeado 'Projetos-Independentes-HTML-CSS' Nele há um

Yago Goltara 3 Aug 15, 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
A Virtual Desktop Assistant Written in Python

DesktopAssitant A Virtual Desktop Assistant Written in Python. It's generally a basic virtual assistant The basic purpose of this is to make work easi

Technerd Brainiac 597 Dec 31, 2022
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 07, 2023
Yasb is a highly configurable and hackable taskbar written in python with Qt6.

Yasb: Yet Another Status Bar Yasb is a highly configurable and hackable taskbar written in python with Qt6. This project is still in (very) early deve

Dan 355 Jan 01, 2023
A simple project used Tkinter module to make a seperate window

Project Title This is a program to run a databse where you can store the general information of poeple. This is a very simple project and i have used

Divyansh Bhardwaj 0 Jun 25, 2022
This simple python program can be used to make FontChooser dialog in Tkinter Applications.

tkFontBox This simple python program can be used to make FontChooser dialog in Tkinter Applications. how to use? Copy the tkFontBox.py file into your

Pawan Kumar Prachi 1 Feb 08, 2022
This repository contains some projects that I have done using Python + Tkinter.

This repository contains some projects that I have done using Python + Tkinter.

João Victor Vilela dos Santos 1 Nov 10, 2021
A desktop application developed in Python with PyQt5 to predict demand and help monitor and schedule brewing processes for Barnaby's Brewhouse.

brewhouse-management A desktop application developed in Python with PyQt5 to predict demand and help monitor and schedule brewing processes for Barnab

Isaac Cheng 2 Jul 09, 2022