Popovers

The Gtk.Popover is an special kind of window used for displaying additional information and is often used with button menus and context menus. Popovers are attached to a parent widget and point to it. It’s position can be configured with Gtk.Popover.props.position. Gtk.Popover shows an arrow to visually connect where it points to, this can be disabled setting Gtk.Popover.props.has_arrow to False.

A Gtk.Popover can be opened using Gtk.Popover.popup() and hidden with Gtk.Widget.hide().

GTK also provides Gtk.MenuButton, it’s an special button that can show and hide a Gtk.Popover attached to it using Gtk.MenuButton.props.popover.

Custom Popover

A child widget can be added to a popover using Gtk.Popover.set_child(). The parent of the popover can be set using Gtk.Widget.set_parent().

Example

../../_images/popover.png
 1import gi
 2
 3gi.require_version('Gtk', '4.0')
 4from gi.repository import Gtk
 5
 6
 7class PopoverWindow(Gtk.ApplicationWindow):
 8    def __init__(self, **kargs):
 9        super().__init__(**kargs, title='Popover Demo')
10
11        self.set_default_size(300, 200)
12
13        box = Gtk.Box(spacing=6, orientation=Gtk.Orientation.VERTICAL)
14        box.props.halign = box.props.valign = Gtk.Align.CENTER
15        self.set_child(box)
16
17        popover = Gtk.Popover()
18        popover_box = Gtk.Box()
19        popover_box.append(Gtk.Label(label='Item'))
20        popover.set_child(popover_box)
21
22        button = Gtk.MenuButton(label='Click Me', popover=popover)
23        box.append(button)
24
25        button2 = Gtk.Button(label='Click Me 2')
26        button2.connect('clicked', self.on_button_clicked)
27        box.append(button2)
28
29        self.popover2 = Gtk.Popover()
30        self.popover2.set_child(Gtk.Label(label='Another Popup!'))
31        self.popover2.set_parent(button2)
32        self.popover2.props.position = Gtk.PositionType.LEFT
33
34    def on_button_clicked(self, _button):
35        self.popover2.popup()
36
37
38def on_activate(app):
39    win = PopoverWindow(application=app)
40    win.present()
41
42
43app = Gtk.Application(application_id='com.example.App')
44app.connect('activate', on_activate)
45
46app.run(None)