Release Notes#
v5.0.0#
Released: 2025-11-30
New Features
The Hooks use_async() and use_async_call() now have an optional
max_concurrent argument which can allow more than one async call to run
concurrently. The max_concurrent argument
defaults to 1, which is the same behavior as before.
Migration Guide
Because the max_concurrent argument
defaults to 1, which is the same behavior as before, most user code
will not be affected by this change.
Breaking Change The use_async_call() Hook is no longer thread-safe.
If you were relying on
the thread-safety of use_async_call() then you should wrap it in a
asyncio.call_soon_threadsafe
function.
import asyncio
main_loop = asyncio.get_event_loop()
async def my_function_async(arg: str):
print(arg)
my_function, my_function_cancel = use_async_call(my_function_async)
def thread_safe_my_function(arg: str):
"""This function can be passed to another thread and called by that thread."""
main_loop.call_soon_threadsafe(my_function, arg)
Breaking Change use_async() and use_async_call() no longer
suppress exceptions other than CancelledError.
Unhandled exceptions in async functions will raise into the event loop
as they normally would.
Breaking Change Deleted deprecated functions use_callback
Icon IconButton alert file_dialog.
v4.4.1#
Released: 2025-10-14
Bugfix:
CustomWidgetstyleprop applies to the widget.
v4.4.0#
Released: 2025-08-23
VScrollView,HScrollView,FixScrollViewnew propsscrollbar_policy_horizontal,scrollbar_policy_vertical.
v4.3.0#
Released: 2025-07-20
New Hook
use_palette_edifice().
v4.2.0#
Released: 2025-07-15
VScrollView,HScrollView,FixScrollViewnew propson_scroll_vertical,on_scroll_horizontal,on_range_vertical,on_range_horizontal.
v4.1.0#
Released: 2025-06-24
New
QtWidgetElementpropon_focus.
v4.0.1#
Released: 2025-05-27
Bugfix:
FlowViewchildren re-ordering layout update bug.
v4.0.0#
Released: 2025-05-14
Breaking Changes
run_subprocess_with_callback()takes a normal function instead of anasynccoroutine for thesubprocessargument.If you want the
subprocessto be anasyncfunction then make a new event loop and use that as the event loop for the Process.Example async subprocess function#def my_subprocess(callback: typing.Callable[[int], None]) -> str: async def work() -> str: callback(1) await asyncio.sleep(1) return "done" return asyncio.new_event_loop().run_until_complete(work())
Migration Guide:
Unfortunately Pyright will not error on this change. You must check each
run_subprocess_with_callback()call site and make sure that thesubprocessargument is a normal function, not anasyncfunction.
v3.2.3#
Released: 2025-04-19
Bugfix:
ButtonViewon_triggertype hint.
v3.2.2#
Released: 2025-04-10
Bugfix: Inspector spinning refresh loop introduced in v3.2.1.
logging.getLogger("Edifice")mean time resets after each log print.
v3.2.1#
Released: 2025-04-10
Bugfix
use_state(),use_context_select(): when the state setter is called with the same state it should not cause re-render.
v3.2.0#
Released: 2025-04-09
v3.1.0#
Released: 2025-04-07
New Hook
use_context_select().Bugfix in
use_context(): too many setters registered to the global context.
v3.0.0#
Released: 2025-02-08
Bugfix for unmounting Graphics Effects.
Deprecated
IconButton. Instead useButtonView.Deprecated
Icon. Instead useImageSvg.Introduced internal type
PropsDiffwhich improves speed by reducing the number of Qt mutation commands issued.
Breaking Changes
PropsDicttype is now an alias fordict[str, Any].Migration Guide:
If you have a user subclass of
QtWidgetElementthen you will need to re-write the_qt_update_commands()method.ContextMenuTypechanged fromMappingtotuple.CustomWidgetdeleted functionpaint, addedCustomWidget.update().Labelpropword_wrapnow defaults toFalse, as it does in Qt.Migration Guide:
Base Elements event handlers no longer accept an
asynccoroutine function.We decided this because it is almost always a bug to start a new coroutine Task from an event handler, because the
@componentmay unmount while the event handler Task is still running.Instead use
use_async_call()to asynchronously handle an event. Then the coroutine Task will be cancelled if the@componentunmounts.If you are sure that you want to “fire-and-forget” a coroutine in response to an event, then use any of the usual methods from asyncio Coroutines and Tasks. such as create_task.
Migration Guide:
Pyright will show errors for
asyncevent handlers.
v2.14.2#
Released: 2025-02-03
Fix
use_async()bug introduced in v2.14.1.
v2.14.1#
Released: 2025-02-03
Fix rendering bug introduced in v2.14.0 from
App.start_loop()changes.
v2.14.0#
Released: 2025-02-02
New Styling props Graphics Effects
Appbugfix hang when Exception raised on first render.Deprecated functions
alertfile_dialogset_trace.
v2.13.0#
Released: 2025-01-29
If the
subprocessexits abnormally without returning a value then a ProcessError will be raised fromrun_subprocess_with_callback().
v2.12.0#
Released: 2025-01-27
run_subprocess_with_callback()new argumentdaemon.
v2.11.4#
Released: 2025-01-19
run_subprocess_with_callback()improvements: Handle multiple callbacks with no delay. Drain the callback_send queue before joining the Process.
v2.11.3#
Released: 2025-01-17
use_async()bugfix for exceptions raised from the async function.
v2.11.2#
Released: 2025-01-17
run_subprocess_with_callback()don’tterminateon normal return.
v2.11.1#
Released: 2025-01-15
run_subprocess_with_callback()reduced the number of incidental processes and threads created. Removedmultiprocessing.Managerfrom documentation.
v2.11.0#
Released: 2025-01-10
run_subprocess_with_callback()callbackexceptions will be suppressed.
v2.10.0#
Released: 2025-01-08
New utility function
utilities.run_subprocess_with_callback().
v2.9.1#
Released: 2025-01-06
Change
pyproject.tomlfrom Poetry to Setuptools build backend.
v2.9.0#
Released: 2024-12-28
New Hooks:
provide_context(),use_context().Styling
styleprop"align"can take an AlignmentFlag.Deprecate Hook
use_callbackin favor ofuse_memo().
v2.8.1#
Released: 2024-12-18
v2.8.0#
Released: 2024-12-13
New Base Element
ScrollBar.New
QtWidgetElementpropon_mouse_wheel.
v2.7.1#
Released: 2024-12-12
Bugfix
VScrollViewHScrollViewon_resizeevent handler will not interfere with the resizing behavior ofQScrollArea.
v2.7.0#
Released: 2024-12-10
New Hook
use_memo().Bugfix
QtWidgetElementchildren. Fix bug children disappeared when re-rendering with no changes.
v2.6.1#
Released: 2024-11-09
Bugfix
QtWidgetElementstyleprop will not be mutated.
v2.6.0#
Released: 2024-11-02
Labelnew proptext_format.
v2.5.0#
Released: 2024-10-10
New Hook
use_callback.Hook
use_state()setter function will be stable across renders.
v2.4.0#
Released: 2024-10-06
TabViewbugfix
v2.3.0#
Released: 2024-10-05
TextInputnew propcompleter.QtWidgetElementnew argument_focus_open.QtWidgetElementon_key_downandon_key_upevents will propagate to parent.edifice.extramodule does not re-export extra Elements because that requires additional dependencies.
v2.2.0#
Released: 2024-09-29
Inspector style bugfix.
v2.1.0#
Released: 2024-09-27
Windownew props_size_open,full_screen.Windowrenamed argumenton_opento_on_open.WindowPopViewnew props_size_open,full_screen.
v2.0.1#
Released: 2024-09-22
Delete method
TableGridViewrow().New Element
TableGridRow.TableGridViewprops type change fromlisttotuple.Labeldelete propeditable.Delete deprecated
ViewandScrollView.Delete deprecated
"margin"alias for"padding"in Views.Remove
stylepropSequencetype. (stylemust be adict, not alist[dict].)Dependency
PySide6-Essentialstested.New Hook
use_stop().WindowWindowPopViewnew arg_size_open.
with TableGridView() as tgv:
with tgv.row():
Label("row")
with TableGridView():
with TableGridRow():
Label("row")
v1.5.0#
Released: 2024-09-20
New Base Element
WindowPopView.
v1.4.0#
Released: 2024-09-13
Hook
use_state()new feature initializer function.
v1.3.0#
Released: 2024-09-12
New Hook
use_hover().
v1.2.0#
Released: 2024-09-10
Windownew propon_open.New utility functions
utilities.theme_is_light(),utilities.palette_edifice_light(),utilities.palette_edifice_dark().Delete deprecated method
App.set_stylesheet.
v1.1.0#
Released: 2024-09-05
SpinInputnew propsingle_step.
v1.0.0#
Released: 2024-08-27
The API and features are pretty stable and reliable now, so this is version 1.
v0.8.1#
Released: 2024-08-27
Bugfix for the Harmonic Oscillator example.
Change Sphinx theme to
pydata-sphinx-themefor documentation.
v0.8.0#
Released: 2024-07-27
New Element:
NumpyImage.Inspector improvements and debugging.
Slideron_changeevent handler prop can be a future.childrenprop type changed totuple[Element, ...].This should get rid of the lint warnings about the argument default
[]value.Deprecate
View,ScrollView.- Replace
Viewwith: - Replace
ScrollViewwith:
- Replace
We are eliminating the layout= "row" | "column" | "none" prop because it
never worked as a prop. If the value of the layout prop was
changed then the layout of the View would not change. To render a
View(layout="row") and then replace it with a
View(layout="column"), it was necessary to add
unique set_key() so that the reconciliation algorithm would recognize
that the Views needed to be destroyed and recreated. This behavior was
buggy and surprising and now it’s gone.
ButtonView is now a subclass of HBoxView.
For column layout, put a VBoxView inside the ButtonView.
We have added functions View(), ScrollView() which behave like the
old elements of the same name, so that old code will still work, probably.
These functions have deprecation warnings at the type level and at runtime,
and they will be removed in the future.
v0.7.4#
Released: 2024-06-14
component()composition withchildrenprops andchild_place().
v0.7.3#
Released: 2024-06-12
Viewlayout="none"remove minimum size 100×100.
v0.7.2#
Released: 2024-06-11
Bugfix
Viewlayout="none"added children become visible.
v0.7.1#
Released: 2024-06-06
Prop
paddingforViewlayout Elements.
v0.7.0#
Released: 2024-06-04
RadioButtonfully declarativecheckedprop.CheckBoxfully declarativecheckedprop.
The state of RadioButton and CheckBox is now dependent only
on the checked prop.
This means that RadioButton “grouping” is now fully independent
of the parent widget, and only depends on how the checked prop
is calculated.
v0.6.2#
Released: 2024-05-22
SpinInputbugfix: Set value after min/max.
v0.6.1#
Released: 2024-05-22
SpinInputbugfix: Blockon_changesignal while setting min and max value.
v0.6.0#
Released: 2024-05-21
- Breaking changes in
Dropdown. Option text is not editable.
Option selection is index based, not text-based.
- Breaking changes in
v0.5.6#
Released: 2024-05-18
New base element
TextInputMultiline.Labelprop text must be typestr.
v0.5.5#
Released: 2024-04-30
bugfix
QtWidgetElementon_resizeevent handler prop.
v0.5.4#
Released: 2024-04-29
CommandTypenon-private for writing customQtWidgetElementclasses.QtWidgetElementon_resizeevent handler prop.enable_mouse_scrollprop forDropdown.
v0.5.3#
Released: 2024-04-22
v0.5.2#
Released: 2024-04-01
New Hook
use_effect_final()During
use_async()CancelledError, allow callinguse_state()setter functions without causing re-render of an unmounting component.
v0.5.1#
Released: 2024-03-27
Big reductions in memory leaking from
use_state()Hook.Bugfix: After
App.stop(), don’t run new renders, also don’t schedule newuse_async()calls.
v0.5.0#
Released: 2024-03-21
v0.4.5#
Released: 2024-03-21
v0.4.4#
Released: 2024-03-16
Inspector is working now with
use_state().Delete
StateManagerandStateValue.Delete all state rollback features.
v0.4.3#
Released: 2024-03-06
TextInputbugfix don’tsetTexton every render.Clean up Python dependencies.
v0.4.2#
Released: 2024-02-26
use_effect()allways run whendependenciesisNone.extra.PyQtPlotdisable mouse interaction.
v0.4.1#
Released: 2024-02-17
Rending logic correctness and stability improvements.
use_async()window close Task done bugfix.use_state()will not re-render if state is__eq__after update.
v0.4.0#
Released: 2024-02-08
Major changes to App and the Window
AppApp.start_loop()runs the event loop to completion. It no longer requires the user to run the loop. The user should never callloop.run_forever().- New method
App.stop() Will unmount all Elements.
Will call all
use_effect()cleanup functions.Will cancel all
use_async()tasks and wait until they are cancelled.
- New method
WindowWindowis a subclass ofViewand can have multiple children.Windowno longer needs an extraViewchild for hot-reloading to work properly.Qt window on_close event causes
App.stop().
Bugfixes:
use_effect()runs after all the render prop updates.
v0.3.7#
Released: 2024-02-06
Breaking change: Hook
use_async_call()returns canceller function in a tuple.
v0.3.6#
Released: 2024-02-06
Hooks
use_async()anduse_async_call()are manually cancellable.
v0.3.5#
Released: 2024-02-03
use_async()bugfix.
v0.3.4#
Released: 2024-01-31
New Hook
use_async_call()
v0.3.3#
Released: 2024-01-25
Internal improvements and typing-extensions requirement.
v0.3.2#
Released: 2024-01-22
Hooks are preserved during hot-reload.
v0.3.1#
Released: 2024-01-19
Hot-reload improvements and bugfixes.
TableGridViewimprovements and bugfixes.
v0.3.0#
Released: 2023-12-19
- New Base Elements:
QtWidgetElementon_dropevent handler.- Extra Elements
extra.MatplotlibFigureextra.PyQtPlot
Removed numpy dependency.
Bugfixes in child diffing and reconciliation.
use_effect()cleanup function can beNone.Bugfix
use_async()cancellation of previous task.Base Element
Slideronly allows integer values.Merged Base Elements
ImageandImageAspectRemoved deprecated modules
forms,plotting.Hot-reload bugfixes.
v0.2.1#
Released: 2023-11-14
v0.2.0#
Released: 2023-11-13
This version has a lot of breaking changes. We have done essentially the same upgrade that React.js did when they upgraded to function components and Hooks in version 16.8.
component()render function decorator instead ofComponentsubclass. Renamed oldComponenttoElement. Deprecated the API for users to inherit fromElement. Privatized most of theElementAPI.Hooks instead of
StateValueandStateManager, which are deprecated.New
withcontext manager syntax for declaring children instead of the Element__call__syntax for declaring children.Moved
ButtonView,FlowView,ImageAspect,TableGridViewto Base Elements.Deprecated all Higher-level Components.
Other miscellaneous improvements.
The old API for writing Elements
by inheriting from the Component class, overriding the render()
function, and calling self.set_state() has has been deprecated.
A new API
for writing Elements with the component() decorator and Hooks has replaced the
old API. Most of the old API machinery still exists, but has been hidden
from the public API. If you want to upgrade
old code to this version but don’t want to completely re-write for the new
API, then you can make a few changes and run your old code.
Componenthas been renamed toElement.The
Elementrender()function has been renamed to_render_element(). Most other methods ofElementhave also been renamed with a prefix underscore. The methodset_state()is now_set_state().The
StateValueandStateManagercan be imported from moduleedifice.state.
v0.1.2#
Released: 2023-10-06
PropsDicttype annotations.Documentation and metadata improvements.
v0.1.1#
Released: 2023-09-15
Documentation and metadata improvements.
v0.1.0#
Released: 2023-09-14
Upgrade to PySide6/PyQt6. Deprecate PySide2/PyQt5.
New Base Component
ImageSvg.Component
Labelnew propslink_open.QtWidgetComponentnew propssize_policy.Create the main
QEventLoopbefore the firstApprender.Component
Imagepropssrccan be aQtGui.QImage.Deleted
setup.py, added Poetrypyproject.toml.Appnew propsqapplication.New Higher-level Component:
ImageAspect.New Higher-level Component:
ButtonView.New Higher-level Component:
FlowView.New Higher-level Component:
TableGridView.
v0.0.10#
Released: 2021-07-15
Fix deletion from View and ScrollView.
Add alert and file dialog options.
v0.0.9#
Released: 2021-06-20
Add grid view.
Bug fix with overriding default mouse events.
Add global stylesheets.
Fix label_map.
Add optional QApplication app name in the App constructor.
Fix prop comparison of np arrays.
Add support for keydown and keyup events.
Fix on_change event for textinput.
v0.0.8#
Released: 2021-02-04
Bug fixes for dynamic loading, and clearer error messages for Dropdowns and Sliders.
v0.0.7#
Released: 2021-02-02
Bug fixes for checkboxes and forms.
v0.0.6#
Released: 2021-01-27
Support for asyncio.
v0.0.5#
Released: 2021-01-26
First public release.