15. ComboBox

A Gtk.ComboBox permite a seleção de um item em um menu suspenso. Eles são preferíveis a ter muitos botões de opção na tela, pois ocupam menos espaço. Se apropriado, ele pode mostrar informações extras sobre cada item, como texto, uma imagem, uma caixa de seleção ou uma barra de progresso.

Gtk.ComboBox é muito similar a Gtk.TreeView, já que ambos usam o padrão model-view; A lista de opções válidas é especificada na forma de um modelo de árvore, e a exibição das opções pode ser adaptada aos dados no modelo usando renderizadores de célula. Se a caixa de combinação contiver um grande número de itens, talvez seja melhor exibi-los em uma grade em vez de em uma lista. Isso pode ser feito chamando Gtk.ComboBox.set_wrap_width().

A default value can be set by calling Gtk.ComboBox.set_active() with the index of the desired value.

O widget Gtk.ComboBox geralmente restringe o usuário às opções disponíveis, mas ele pode opcionalmente ter um Gtk.Entry, permitindo que o usuário insira texto arbitrário se nenhuma das opções disponíveis for adequada. Para fazer isso, use um dos métodos estáticos Gtk.ComboBox.new_with_entry() ou Gtk.ComboBox.new_with_model_and_entry() para criar uma instância Gtk.ComboBox.

Para uma lista simples de escolhas textuais, a API de visão de modelo de Gtk.ComboBox pode ser um pouco avassaladora. Neste caso, Gtk.ComboBoxText oferece uma alternativa simples. Ambos Gtk.ComboBox e Gtk.ComboBoxText podem conter uma entrada.

15.1. Exemplo

_images/combobox_example.png
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class ComboBoxWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="ComboBox Example")

        self.set_border_width(10)

        name_store = Gtk.ListStore(int, str)
        name_store.append([1, "Billy Bob"])
        name_store.append([11, "Billy Bob Junior"])
        name_store.append([12, "Sue Bob"])
        name_store.append([2, "Joey Jojo"])
        name_store.append([3, "Rob McRoberts"])
        name_store.append([31, "Xavier McRoberts"])

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)

        name_combo = Gtk.ComboBox.new_with_model_and_entry(name_store)
        name_combo.connect("changed", self.on_name_combo_changed)
        name_combo.set_entry_text_column(1)
        vbox.pack_start(name_combo, False, False, 0)

        country_store = Gtk.ListStore(str)
        countries = [
            "Austria",
            "Brazil",
            "Belgium",
            "France",
            "Germany",
            "Switzerland",
            "United Kingdom",
            "United States of America",
            "Uruguay",
        ]
        for country in countries:
            country_store.append([country])

        country_combo = Gtk.ComboBox.new_with_model(country_store)
        country_combo.connect("changed", self.on_country_combo_changed)
        renderer_text = Gtk.CellRendererText()
        country_combo.pack_start(renderer_text, True)
        country_combo.add_attribute(renderer_text, "text", 0)
        vbox.pack_start(country_combo, False, False, True)

        currencies = [
            "Euro",
            "US Dollars",
            "British Pound",
            "Japanese Yen",
            "Russian Ruble",
            "Mexican peso",
            "Swiss franc",
        ]
        currency_combo = Gtk.ComboBoxText()
        currency_combo.set_entry_text_column(0)
        currency_combo.connect("changed", self.on_currency_combo_changed)
        for currency in currencies:
            currency_combo.append_text(currency)

        currency_combo.set_active(0)
        vbox.pack_start(currency_combo, False, False, 0)

        self.add(vbox)

    def on_name_combo_changed(self, combo):
        tree_iter = combo.get_active_iter()
        if tree_iter is not None:
            model = combo.get_model()
            row_id, name = model[tree_iter][:2]
            print("Selected: ID=%d, name=%s" % (row_id, name))
        else:
            entry = combo.get_child()
            print("Entered: %s" % entry.get_text())

    def on_country_combo_changed(self, combo):
        tree_iter = combo.get_active_iter()
        if tree_iter is not None:
            model = combo.get_model()
            country = model[tree_iter][0]
            print("Selected: country=%s" % country)

    def on_currency_combo_changed(self, combo):
        text = combo.get_active_text()
        if text is not None:
            print("Selected: currency=%s" % text)


win = ComboBoxWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()