TextField
A text field lets the user enter text, either with hardware keyboard or with an onscreen keyboard.
Example:
ft.TextField(label="Name", hint_text="Jane Doe")

Inherits: FormFieldControl, AdaptiveControl
Properties
always_call_on_tap- TBDanimate_cursor_opacity- TBDautocorrect- Whether to enable autocorrection.autofill_hints- Helps the autofill service identify the type of this text input.autofocus- True if the control will be selected as the initial focus.can_request_focus- TBDcan_reveal_password- Displays a toggle icon button that allows revealing the entered password.capitalization- Enables automatic on-the-fly capitalization of entered text.clip_behavior- TBDcursor_color- The color of TextField cursor.cursor_error_color- TBDcursor_height- Sets cursor height.cursor_radius- Sets cursor radius.cursor_width- Sets cursor width.enable_ime_personalized_learning- TBDenable_interactive_selection- TBDenable_stylus_handwriting- TBDenable_suggestions- Whether to show input suggestions as the user types.ignore_pointers- TBDignore_up_down_keys- Whether to intercept Arrow-Up and Arrow-Down when this field has focus.input_filter- Provides as-you-type filtering/validation.keyboard_brightness- TBDkeyboard_type- The type of keyboard to use for editing the text.max_length- Limits a maximum number of characters that can be entered into TextField.max_lines- The maximum number of lines to show at one time, wrapping if necessary.min_lines- The minimum number of lines to occupy when the content spans fewer lines.mouse_cursor- TBDmultiline- Whether this field can contain multiple lines of text.obscuring_character- TBDpassword- Whether to hide the text being edited.read_only- Whether the text can be changed.scroll_padding- TBDselection- Represents the current text selection or caret position in the field.selection_color- The color of TextField selection.shift_enter- Changes the behavior ofEnterbutton in multiline textfield to be chat-like, i.e.show_cursor- Whether the field's cursor is to be shown.smart_dashes_type- Whether to allow the platform to automatically format dashes.smart_quotes_type- Whether to allow the platform to automatically format quotes.strut_style- TBDtext_align- How the text should be aligned horizontally.value- Current value of this text field.
Events
on_blur- Called when the control has lost focus.on_change- Called when the typed input for the TextField has changed.on_click- TBDon_focus- Called when the control has received focus.on_selection_change- Called when the text selection or caret position changes.on_submit- Called when user presses ENTER while focus is on TextField.on_tap_outside- TBD
Examples
Basic Example
import flet as ft
def main(page: ft.Page):
def handle_button_click(e: ft.Event[ft.Button]):
message.value = (
f"Textboxes values are: '{tb1.value}', '{tb2.value}', "
f"'{tb3.value}', '{tb4.value}', '{tb5.value}'."
)
page.add(
ft.SafeArea(
content=ft.Column(
controls=[
tb1 := ft.TextField(label="Standard"),
tb2 := ft.TextField(
label="Disabled",
disabled=True,
value="First name",
),
tb3 := ft.TextField(
label="Read-only",
read_only=True,
value="Last name",
),
tb4 := ft.TextField(
label="With placeholder",
hint_text="Please enter text here",
),
tb5 := ft.TextField(
label="With an icon",
icon=ft.Icons.EMOJI_EMOTIONS,
),
ft.Button(content="Submit", on_click=handle_button_click),
message := ft.Text(),
],
),
),
)
if __name__ == "__main__":
ft.run(main)

Handling change events
import flet as ft
def main(page: ft.Page):
def handle_field_change(e: ft.Event[ft.TextField]):
message.value = e.control.value
page.add(
ft.SafeArea(
content=ft.Column(
controls=[
ft.TextField(
label="Textbox with 'change' event:",
on_change=handle_field_change,
),
message := ft.Text(),
],
),
),
)
if __name__ == "__main__":
ft.run(main)

Handling selection changes
import flet as ft
def main(page: ft.Page):
page.title = "Text selection"
def handle_selection_change(e: ft.TextSelectionChangeEvent[ft.TextField]):
selection.value = (
f"Selection: '{e.selected_text}'" if e.selected_text else "No selection."
)
selection_details.value = f"start={e.selection.start}, end={e.selection.end}"
caret.value = f"Caret position: {e.selection.end}"
async def select_characters(e: ft.Event[ft.Button]):
await field.focus()
field.selection = ft.TextSelection(
base_offset=0, extent_offset=len(field.value)
)
async def move_caret(e: ft.Event[ft.Button]):
await field.focus()
field.selection = ft.TextSelection(base_offset=0, extent_offset=0)
page.add(
ft.SafeArea(
content=ft.Column(
spacing=10,
controls=[
field := ft.TextField(
value=(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
),
multiline=True,
min_lines=3,
autofocus=True,
on_selection_change=handle_selection_change,
),
selection := ft.Text("Select some text from the field."),
selection_details := ft.Text(),
caret := ft.Text("Caret position: -"),
ft.Button(
content="Select all text",
on_click=select_characters,
),
ft.Button(
content="Move caret to start",
on_click=move_caret,
),
],
),
)
)
if __name__ == "__main__":
ft.run(main)
Password with reveal button
import flet as ft
def main(page: ft.Page):
page.add(
ft.SafeArea(
content=ft.TextField(
label="Password with reveal button",
password=True,
can_reveal_password=True,
),
)
)
if __name__ == "__main__":
ft.run(main)

Multiline fields
import flet as ft
def main(page: ft.Page):
page.add(
ft.SafeArea(
content=ft.Column(
controls=[
ft.TextField(
label="Standard",
multiline=True,
),
ft.TextField(
label="Disabled",
multiline=True,
disabled=True,
value="line1\nline2\nline3\nline4\nline5",
),
ft.TextField(
label="Auto adjusted height with max lines",
multiline=True,
min_lines=1,
max_lines=3,
),
],
),
),
)
if __name__ == "__main__":
ft.run(main)

Underlined and borderless TextFields
import flet as ft
def main(page: ft.Page):
page.add(
ft.SafeArea(
content=ft.Column(
controls=[
ft.TextField(
label="Underlined",
border=ft.InputBorder.UNDERLINE,
hint_text="Enter text here",
),
ft.TextField(
label="Underlined filled",
border=ft.InputBorder.UNDERLINE,
filled=True,
hint_text="Enter text here",
),
ft.TextField(
label="Borderless",
border=ft.InputBorder.NONE,
hint_text="Enter text here",
),
ft.TextField(
label="Borderless filled",
border=ft.InputBorder.NONE,
filled=True,
hint_text="Enter text here",
),
],
),
),
)
if __name__ == "__main__":
ft.run(main)

Setting prefixes and suffixes
import flet as ft
def main(page: ft.Page):
def handle_button_click(e: ft.Event[ft.Button]):
message.value = (
"Textboxes values are: "
f"'{prefix_field.value}', "
f"'{suffix_field.value}', "
f"'{prefix_suffix_field.value}', "
f"'{color_field.value}'."
)
page.add(
ft.SafeArea(
content=ft.Column(
controls=[
prefix_field := ft.TextField(
label="With prefix",
prefix="https://",
),
suffix_field := ft.TextField(
label="With suffix",
suffix=".com",
),
prefix_suffix_field := ft.TextField(
label="With prefix and suffix",
prefix="https://",
suffix=".com",
enable_interactive_selection=True,
),
color_field := ft.TextField(
label="My favorite color",
icon=ft.Icons.FORMAT_SIZE,
hint_text="Type your favorite color",
helper="You can type only one color",
counter="{value_length}/{max_length} chars used",
prefix_icon=ft.Icons.COLOR_LENS,
suffix="...is your color",
max_length=20,
),
ft.Button(content="Submit", on_click=handle_button_click),
message := ft.Text(),
],
),
),
)
if __name__ == "__main__":
ft.run(main)

Styled TextField
import flet as ft
async def main(page: ft.Page):
page.padding = 50
tf = ft.TextField(
text_size=30,
cursor_color=ft.Colors.RED,
selection_color=ft.Colors.YELLOW,
color=ft.Colors.PINK,
bgcolor=ft.Colors.BLACK_26,
filled=True,
focused_color=ft.Colors.GREEN,
focused_bgcolor=ft.Colors.CYAN_200,
border_radius=30,
border_color=ft.Colors.GREEN_800,
focused_border_color=ft.Colors.GREEN_ACCENT_400,
max_length=20,
capitalization=ft.TextCapitalization.CHARACTERS,
)
page.add(
ft.SafeArea(
content=tf,
)
)
await tf.focus()
if __name__ == "__main__":
ft.run(main)
Custom label, hint, helper, and counter texts and styles
import flet as ft
def main(page: ft.Page):
page.theme_mode = ft.ThemeMode.LIGHT
def handle_field_change(e: ft.Event[ft.TextField]):
message.value = e.control.value
page.add(
ft.SafeArea(
content=ft.Column(
controls=[
ft.TextField(
on_change=handle_field_change,
text_style=ft.TextStyle(
size=15,
italic=True,
color=ft.Colors.DEEP_ORANGE_600,
bgcolor=ft.Colors.LIME_ACCENT_200,
),
label="Label",
label_style=ft.TextStyle(
size=17,
weight=ft.FontWeight.BOLD,
italic=True,
color=ft.Colors.BLUE,
bgcolor=ft.Colors.RED_700,
),
hint_text="Hint",
hint_style=ft.TextStyle(
size=15,
weight=ft.FontWeight.BOLD,
italic=True,
color=ft.Colors.PINK_ACCENT,
bgcolor=ft.Colors.BROWN_400,
),
helper="Helper",
helper_style=ft.TextStyle(
size=14,
weight=ft.FontWeight.BOLD,
color=ft.Colors.DEEP_PURPLE,
bgcolor=ft.Colors.BLUE_50,
),
counter="Counter",
counter_style=ft.TextStyle(
size=14,
italic=True,
color=ft.Colors.YELLOW,
bgcolor=ft.Colors.GREEN_500,
),
),
message := ft.Text(),
],
),
),
)
if __name__ == "__main__":
ft.run(main)
Properties
animate_cursor_opacityclass-attributeinstance-attribute
animate_cursor_opacity: Optional[bool] = NoneTBD
autocorrectclass-attributeinstance-attribute
autocorrect: bool = TrueWhether to enable autocorrection.
autofill_hintsclass-attributeinstance-attribute
autofill_hints: Optional[Union[AutofillHint, list[AutofillHint]]] = NoneHelps the autofill service identify the type of this text input.
More information here.
autofocusclass-attributeinstance-attribute
autofocus: bool = FalseTrue if the control will be selected as the initial focus. If there is more than one control on a page with autofocus set, then the first one added to the page will get focus.
can_reveal_passwordclass-attributeinstance-attribute
can_reveal_password: bool = FalseDisplays a toggle icon button that allows revealing the entered password. Is shown if both password and can_reveal_password are True.
The icon is displayed in the same location as suffix
and in case both can_reveal_password/password and suffix are
provided, then the suffix won't be shown.
capitalizationclass-attributeinstance-attribute
capitalization: Optional[TextCapitalization] = NoneEnables automatic on-the-fly capitalization of entered text.
Defaults to flet.TextCapitalization.NONE.
clip_behaviorclass-attributeinstance-attribute
clip_behavior: ClipBehavior = ClipBehavior.HARD_EDGETBD
cursor_colorclass-attributeinstance-attribute
cursor_color: Optional[ColorValue] = NoneThe color of TextField cursor.
cursor_error_colorclass-attributeinstance-attribute
cursor_error_color: Optional[ColorValue] = NoneTBD
cursor_heightclass-attributeinstance-attribute
cursor_height: Optional[Number] = NoneSets cursor height.
cursor_radiusclass-attributeinstance-attribute
cursor_radius: Optional[Number] = NoneSets cursor radius.
enable_ime_personalized_learningclass-attributeinstance-attribute
enable_ime_personalized_learning: bool = TrueTBD
enable_interactive_selectionclass-attributeinstance-attribute
enable_interactive_selection: bool = TrueTBD
enable_stylus_handwritingclass-attributeinstance-attribute
enable_stylus_handwriting: bool = TrueTBD
enable_suggestionsclass-attributeinstance-attribute
enable_suggestions: bool = TrueWhether to show input suggestions as the user types.
This flag only affects Android. On iOS, suggestions are tied directly to
autocorrect, so that suggestions are only shown when autocorrect is True.
On Android autocorrection and suggestion are controlled separately.
ignore_up_down_keysclass-attributeinstance-attribute
ignore_up_down_keys: bool = FalseWhether to intercept Arrow-Up and Arrow-Down when this field has focus.
When set to True, pressing those keys does not move the caret to the beginning
or end of the text respectively.
input_filterclass-attributeinstance-attribute
input_filter: Optional[InputFilter] = NoneProvides as-you-type filtering/validation.
Similar to the on_change callback, the input filters are not applied when the content of the field is changed programmatically.
keyboard_brightnessclass-attributeinstance-attribute
keyboard_brightness: Optional[Brightness] = NoneTBD
keyboard_typeclass-attributeinstance-attribute
keyboard_type: KeyboardType = KeyboardType.TEXTThe type of keyboard to use for editing the text.
max_lengthclass-attributeinstance-attribute
max_length: Annotated[Optional[int], V.or_(V.gt(0), V.eq(-1), message='max_length must be either strictly greater than 0 or equal to -1')] = NoneLimits a maximum number of characters that can be entered into TextField.
Raises:
- ValueError - If it is not strictly greater than
0or equal to-1.
max_linesclass-attributeinstance-attribute
max_lines: Annotated[Optional[int], V.gt(0), V.ge_field(min_lines)] = NoneThe maximum number of lines to show at one time, wrapping if necessary.
This affects the height of the field itself and does not limit the number of lines that can be entered into the field.
If this is 1 (the default), the text will not wrap, but will scroll horizontally
instead.
Raises:
- ValueError - If it is not strictly greater than
0. - ValueError - If it is not greater than or equal to min_lines when both are set.
min_linesclass-attributeinstance-attribute
min_lines: Annotated[Optional[int], V.gt(0), V.le_field(max_lines)] = NoneThe minimum number of lines to occupy when the content spans fewer lines.
This affects the height of the field itself and does not limit the number of lines that can be entered into the field.
Defaults to 1.
Raises:
- ValueError - If it is not strictly greater than
0. - ValueError - If it is not less than or equal to max_lines when both are set.
multilineclass-attributeinstance-attribute
multiline: bool = FalseWhether this field can contain multiple lines of text.
passwordclass-attributeinstance-attribute
password: bool = FalseWhether to hide the text being edited.
read_onlyclass-attributeinstance-attribute
read_only: bool = FalseWhether the text can be changed.
When this is set to True, the text cannot be modified by any shortcut or keyboard
operation. The text is still selectable.
selectionclass-attributeinstance-attribute
selection: Optional[TextSelection] = NoneRepresents the current text selection or caret position in the field.
When the user selects text, this property is updated to reflect the selected range. If no text is selected, it contains an empty range indicating the caret position.
Setting this property visually updates the field's selection to match the given value, and hence leads to the on_selection_change event being triggered. To ensure the selection is visible and the event is fired, the text field must be focused. Call focus on the field before setting this property.
selection_colorclass-attributeinstance-attribute
selection_color: Optional[ColorValue] = NoneThe color of TextField selection.
shift_enterclass-attributeinstance-attribute
shift_enter: bool = FalseChanges the behavior of Enter button in multiline textfield to be chat-like, i.e. new line can be added with Shift+Enter and pressing just Enter fires on_submit event.
show_cursorclass-attributeinstance-attribute
show_cursor: bool = TrueWhether the field's cursor is to be shown.
smart_dashes_typeclass-attributeinstance-attribute
smart_dashes_type: bool = TrueWhether to allow the platform to automatically format dashes.
This flag only affects iOS versions 11 and above. As an example of what this does, two consecutive hyphen characters will be automatically replaced with one en dash, and three consecutive hyphens will become one em dash.
smart_quotes_typeclass-attributeinstance-attribute
smart_quotes_type: bool = TrueWhether to allow the platform to automatically format quotes.
This flag only affects iOS. As an example of what this does, a standard vertical double quote character will be automatically replaced by a left or right double quote depending on its position in a word.
text_alignclass-attributeinstance-attribute
text_align: Optional[TextAlign] = NoneHow the text should be aligned horizontally.
Defaults to flet.TextAlign.LEFT.
Events
on_blurclass-attributeinstance-attribute
on_blur: Optional[ControlEventHandler[TextField]] = NoneCalled when the control has lost focus.
on_changeclass-attributeinstance-attribute
on_change: Optional[ControlEventHandler[TextField]] = NoneCalled when the typed input for the TextField has changed.
on_clickclass-attributeinstance-attribute
on_click: Optional[ControlEventHandler[TextField]] = NoneTBD
on_focusclass-attributeinstance-attribute
on_focus: Optional[ControlEventHandler[TextField]] = NoneCalled when the control has received focus.
on_selection_changeclass-attributeinstance-attribute
on_selection_change: Optional[EventHandler[TextSelectionChangeEvent[TextField]]] = NoneCalled when the text selection or caret position changes.
This can be triggered either by user interaction (selecting text or moving the caret) or programmatically (through the selection property).
on_submitclass-attributeinstance-attribute
on_submit: Optional[ControlEventHandler[TextField]] = NoneCalled when user presses ENTER while focus is on TextField.
on_tap_outsideclass-attributeinstance-attribute
on_tap_outside: Optional[ControlEventHandler[TextField]] = NoneTBD