Entries

Entries allows the user to enter text. GTK provides a few entry widgets for different use cases. Those are the generic Gtk.Entry, Gtk.PasswordEntry and Gtk.SearchEntry. Although none of these widgets derive from each other, they implement the Gtk.Editable interface, so they share some properties and methods. You can change and get the contents with the Gtk.Editable.props.text property. You can also limit the number of characters the entry can take with Gtk.Editable.props.max_width_chars.

Occasionally you might want to make an Entry widget read-only. This can be done by setting Gtk.Editable.props.editable to False.

Generic Entry

Gtk.Entry is the standard entry.

Gtk.Entry can be set to show a invisible character using Gtk.Entry.props.visibility and Gtk.Entry.props.invisible_char, this is useful to hide the text of the entry when it is used for example to retrieve passwords. Though Password Entry exist for this specific use case.

Gtk.Entry has the ability to display progress or activity information behind the text. This is similar to Gtk.ProgressBar widget and is commonly found in web browsers to indicate how much of a page download has been completed. To make an entry display such information, use Gtk.Entry.props.progress_fraction, Gtk.Entry.props.progress_pulse_step, or Gtk.Entry.progress_pulse().

Additionally, a Gtk.Entry can show icons at either side of the entry. These icons can be activatable by clicking, can be set up as drag source and can have tooltips. To add an icon, use Gtk.Entry.set_icon_from_icon_name() or one of the various other properties and methods that set an icon from an icon name, Gio.Icon, or a Gdk.Paintable. To set a tooltip on an icon, use Gtk.Entry.set_icon_tooltip_text() or the corresponding function for markup.

Entries can have a placeholder text, just use Gtk.Entry.props.placeholder_text.

Password Entry

Gtk.PasswordEntry brings some features for password handing. It can show a button to toggle the visibility of the text if you set Gtk.PasswordEntry.props.show_peek_icon to True.

Search Entry

Gtk.SearchEntry is an entry specially designed for use as a search entry. Gtk.SearchEntry allows you to implement the popular “type to search” feature. You can use Gtk.SearchEntry.set_key_capture_widget() to set the parent widget that will redirect its key events to the entry.

Gtk.SearchEntry has the search-changed signal, it differs from Gtk.Editable’s changed in the sense that it gets emitted after a short delay that you can configure with Gtk.SearchEntry.props.search_delay. This way you can get reactive searching without over loading your backend.

Example

../../_images/entries.png
  1import gi
  2
  3gi.require_version('Gtk', '4.0')
  4from gi.repository import Gtk, GLib
  5
  6
  7class EntryWindow(Gtk.ApplicationWindow):
  8    def __init__(self, **kargs):
  9        super().__init__(**kargs, title='Entry Demo')
 10
 11        self.set_size_request(200, 100)
 12
 13        self.timeout_id = None
 14
 15        header = Gtk.HeaderBar()
 16        self.set_titlebar(header)
 17
 18        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
 19        vbox.props.margin_start = 24
 20        vbox.props.margin_end = 24
 21        vbox.props.margin_top = 24
 22        vbox.props.margin_bottom = 24
 23        self.set_child(vbox)
 24
 25        # Gtk.SearchEntry
 26        search = Gtk.SearchEntry()
 27        search.props.placeholder_text = 'Search Entry'
 28        search.set_key_capture_widget(self)
 29        header.set_title_widget(search)
 30        self.set_focus(search)
 31
 32        # Gtk.Entry
 33        self.entry = Gtk.Entry()
 34        self.entry.set_text('Hello World')
 35        vbox.append(self.entry)
 36
 37        hbox = Gtk.Box(spacing=6)
 38        vbox.append(hbox)
 39
 40        self.check_editable = Gtk.CheckButton(label='Editable')
 41        self.check_editable.connect('toggled', self.on_editable_toggled)
 42        self.check_editable.props.active = True
 43        hbox.append(self.check_editable)
 44
 45        self.check_visible = Gtk.CheckButton(label='Visible')
 46        self.check_visible.connect('toggled', self.on_visible_toggled)
 47        self.check_visible.props.active = True
 48        hbox.append(self.check_visible)
 49
 50        self.pulse = Gtk.CheckButton(label='Pulse')
 51        self.pulse.connect('toggled', self.on_pulse_toggled)
 52        hbox.append(self.pulse)
 53
 54        self.icon = Gtk.CheckButton(label='Icon')
 55        self.icon.connect('toggled', self.on_icon_toggled)
 56        hbox.append(self.icon)
 57
 58        # Gtk.PasswordEntry
 59        pass_entry = Gtk.PasswordEntry()
 60        pass_entry.props.placeholder_text = 'Password Entry'
 61        pass_entry.props.show_peek_icon = True
 62        pass_entry.props.margin_top = 24
 63        vbox.append(pass_entry)
 64
 65    def on_editable_toggled(self, button):
 66        value = button.get_active()
 67        self.entry.set_editable(value)
 68
 69    def on_visible_toggled(self, button):
 70        self.entry.props.visibility = button.props.active
 71
 72    def on_pulse_toggled(self, button):
 73        if button.get_active():
 74            self.entry.props.progress_pulse_step = 0.2
 75            # Call self.do_pulse every 100 ms
 76            self.timeout_id = GLib.timeout_add(100, self.do_pulse)
 77        else:
 78            # Don't call self.do_pulse anymore
 79            GLib.source_remove(self.timeout_id)
 80            self.timeout_id = None
 81            self.entry.props.progress_pulse_step = 0
 82
 83    def do_pulse(self):
 84        self.entry.progress_pulse()
 85        return True
 86
 87    def on_icon_toggled(self, button):
 88        if button.props.active:
 89            icon_name = 'system-search-symbolic'
 90        else:
 91            icon_name = None
 92        self.entry.set_icon_from_icon_name(
 93            Gtk.EntryIconPosition.PRIMARY, icon_name
 94        )
 95
 96
 97def on_activate(app):
 98    win = EntryWindow(application=app)
 99    win.present()
100
101
102app = Gtk.Application(application_id='com.example.App')
103app.connect('activate', on_activate)
104
105app.run(None)