Releases: Textualize/textual
The styles should update on mount now release
The speedy release
A relative minor release, feature wise, but this version much faster CSS processing. You may notice this if you have UIs with 100s of widgets.
Also see a new HowTo: https://textual.textualize.io/how-to/render-and-compose/
[0.45.0] - 2023-12-12
Fixed
- Fixed
DataTable.update_cell
not raising an error with an invalid column key #3335 - Fixed
Input
showing suggestions when not focused #3808 - Fixed loading indicator not covering scrollbars #3816
Removed
- Removed renderables/align.py which was no longer used.
Changed
- Dropped ALLOW_CHILDREN flag introduced in 0.43.0 #3814
- Widgets with an auto height in an auto height container will now expand if they have no siblings #3814
- Breaking change: Removed
limit_rules
from Stylesheet.apply #3844
Added
The Buttery Release
A patch to improve scrolling speed when there are many widgets in the screen.
Scrolling show now be buttery smooth for the screen and other scrolling containers (like the ListView).
[0.44.1] - 2023-12-4
Fixed
- Fixed slow scrolling when there are many widgets #3801
The so long 3.7 release
This release drops support for Python3.7
Additionally, there are a few fixes and some changes. See below for details
[0.44.0] - 2023-12-1
Changed
- Breaking change: Dropped 3.7 support #3766
- Breaking changes #1530
link-hover-background
renamed tolink-background-hover
link-hover-color
renamed tolink-color-hover
link-hover-style
renamed tolink-style-hover
- Brought rxvt's use of shift-numpad keys in line with most other terminals #3769
Added
- Added support for Ctrl+Fn and Ctrl+Shift+Fn keys in urxvt #3737
- Friendly error messages when trying to mount non-widgets #3780
Fixed
The NoWidget fix release
The fixed scrollbar release
The Nothing to See Here Release
The highlight of this release, is the new keyline rule which draws lines around widgets in the margins.
This is similar to border
, but keyline
can overlap with neighbouring widgets. Here's a screenshot. Note how the green borders around the widgets intersect with each other.

See below for the full changelog.
[0.43.0] - 2023-11-28
Fixed
- Fixed mouse targeting issue in
TextArea
when tabs were not fully expanded #3725 - Fixed
Select
not updating after changing theprompt
reactive #2983 - Fixed flicker when updating Markdown #3757
Added
- Added experimental Canvas class #3669
- Added
keyline
rule #3669 - Widgets can now have an ALLOW_CHILDREN (bool) classvar to disallow adding children to a widget #3758
- Added the ability to set the
label
property of aCheckbox
#3765 - Added the ability to set the
label
property of aRadioButton
#3765 - Added app focus/blur for textual-web #3767
Changed
- Method
MarkdownTableOfContents.set_table_of_contents
renamed toMarkdownTableOfContents.rebuild_table_of_contents
#3730 - Exception
Tree.UnknownNodeID
moved out ofTree
, import fromtextual.widgets.tree
#3730 - Exception
TreeNode.RemoveRootError
moved out ofTreeNode
, import fromtextual.widgets.tree
#3730 - Optimized startup time #3753
- App.COMMANDS or Screen.COMMANDS can now accept a callable which returns a command palette provider #3756
The Life Universe and Everything release!
Some fixes, improvements, and updates to Pilot (used in testing).
Also some significant improvements in rendering speed.
A few minor breaking changes, see below for details...
[0.42.0] - 2023-11-22
Fixed
- Duplicate CSS errors when parsing CSS from a screen #3581
- Added missing
blur
pseudo class #3439 - Fixed visual glitched characters on Windows due to Python limitation #2548
- Fixed
ScrollableContainer
to receive focus #3632 - Fixed app-level queries causing a crash when the command palette is active #3633
- Fixed outline not rendering correctly in some scenarios (e.g. on Button widgets) #3628
- Fixed live-reloading of screen CSS #3454
Select.value
could be in an invalid state #3612- Off-by-one in CSS error reporting #3625
- Loading indicators and app notifications overlapped in the wrong order #3677
- Widgets being loaded are disabled and have their scrolling explicitly disabled too #3677
- Method render on a widget could be called before mounting said widget #2914
Added
- Exceptions to
textual.widgets.select
#3614InvalidSelectValueError
for when setting aSelect
to an invalid valueEmptySelectError
when creating/setting aSelect
to have no options whenallow_blank
isFalse
Select
methods #3614clear
is_blank
- Constant
Select.BLANK
to flag an empty selection #3614 - Added
restrict
,type
,max_length
, andvalid_empty
to Input #3657 - Added
Pilot.mouse_down
to simulateMouseDown
events #3495 - Added
Pilot.mouse_up
to simulateMouseUp
events #3495 - Added
Widget.is_mounted
property #3709
Changed
- CSS error reporting will no longer provide links to the files in question #3582
- inline CSS error reporting will report widget/class variable where the CSS was read from #3582
- Breaking change: Setting
Select.value
toNone
no longer clears the selection (SeeSelect.BLANK
andSelect.clear
) #3614 - Breaking change:
Button
no longer inherits fromStatic
, now it inherits directly fromWidget
#3603 - Rich markup in markdown headings is now escaped when building the TOC #3689
- Mechanics behind mouse clicks. See this for more details. #3495
- Breaking change: max/min-width/height now includes padding and border. #3712
The scarily good release
Just in time for Halloween, we have a new release. There are a lot of fixes, and improvement to startup time. A few breaking changes that are unlikely to impact many people.
We also reached the scary milestone of 666 forks!

[0.41.0] - 2023-10-31
Fixed
- Fixed
Input.cursor_blink
reactive not changing blink state afterInput
was mounted #3498 - Fixed
Tabs.active
attribute value not being re-assigned after removing a tab or clearing #3498 - Fixed
DirectoryTree
race-condition crash when changing path #3498 - Fixed issue with
LRUCache.discard
#3537 - Fixed
DataTable
not scrolling to rows that were just added #3552 - Fixed cache bug with
DataTable.update_cell
#3551 - Fixed CSS errors being repeated #3566
- Fix issue with chunky highlights on buttons #3571
- Fixed
OptionList
event leakage fromCommandPalette
toApp
. - Fixed crash in
LoadingIndicator
#3498 - Fixed crash when
Tabs
appeared as a descendant ofTabbedContent
in the DOM #3602 - Fixed the command palette cancelling other workers #3615
Added
- Add Document
get_index_from_location
/get_location_from_index
#3410 - Add setter for
TextArea.text
#3525 - Added
key
argument to theDataTable.sort()
method, allowing the table to be sorted using a custom function (or other callable) #3090 - Added
initial
to all css rules, which restores default (i.e. value from DEFAULT_CSS) #3566 - Added HorizontalPad to pad.py #3571
- Added
AwaitComplete
class, to be used for optionally awaitable return values #3498
Changed
- Breaking change:
Button.ACTIVE_EFFECT_DURATION
classvar converted toButton.active_effect_duration
attribute #3498 - Breaking change:
Input.blink_timer
made private (renamed toInput._blink_timer
) #3498 - Breaking change:
Input.cursor_blink
reactive updated to not run on mount (nowinit=False
) #3498 - Breaking change:
AwaitTabbedContent
class removed #3498 - Breaking change:
Tabs.remove_tab
now returns anAwaitComplete
instead of anAwaitRemove
#3498 - Breaking change:
Tabs.clear
now returns anAwaitComplete
instead of anAwaitRemove
#3498 TabbedContent.add_pane
now returns anAwaitComplete
instead of anAwaitTabbedContent
#3498TabbedContent.remove_pane
now returns anAwaitComplete
instead of anAwaitTabbedContent
#3498TabbedContent.clear_pane
now returns anAwaitComplete
instead of anAwaitTabbedContent
#3498Tabs.add_tab
now returns anAwaitComplete
instead of anAwaitMount
#3498DirectoryTree.reload
now returns anAwaitComplete
, which may be awaited to ensure the node has finished being processed by the internal queue #3498Tabs.remove_tab
now returns anAwaitComplete
, which may be awaited to ensure the tab is unmounted and internal state is updated #3498App.switch_mode
now returns anAwaitMount
, which may be awaited to ensure the screen is mounted #3498- Buttons will now display multiple lines, and have auto height #3539
- DataTable now has a max-height of 100vh rather than 100%, which doesn't work with auto
- Breaking change: empty rules now result in an error #3566
- Improved startup time by caching CSS parsing #3575
- Workers are now created/run in a thread-safe way #3586
The loading release
You can now set widget.loading=True
to replace the widget with a loading indicator.
https://twitter.com/willmcgugan/status/1712104087213297791
[0.40.0] - 2023-10-11
- Added
loading
reactive property to widgets #3509