15. ComboBox

En Gtk.ComboBox möjliggör val av ett objekt från en rullgardinsmeny. De föredras över att ha många radioknappar på skärmen då de tar upp mindre utrymme. Om lämpligt kan den visa extra information om varje objekt, så som text, en bild, en kryssruta eller en förloppsindikator.

Gtk.ComboBox` är väldigt lik Gtk.TreeView, då de båda använder model-view-mönstret; listan över giltiga val anges i formen av en trädmodell, och visningen av valen kan anpassas till data i modellen genom att använda cellrenderare. Om kombinationsrutan innehåller ett stort antal objekt kan det vara bättre att visa dem i ett rutnät snarare än i en lista. Detta kan göras genom att anropa Gtk.ComboBox.set_wrap_width().

Ett standardvärde kan ställas in genom att anropa Gtk.ComboBox.set_active() med index för det önskade värdet.

Gtk.ComboBox-komponenten begränsar vanligen användaren till de tillgängliga valen, men den kan valfritt ha ett Gtk.Entry, vilket låter användaren ange godtycklig text om inget av de tillgängliga valen är lämpligt. För att göra detta, använd en av de statiska metoderna Gtk.ComboBox.new_with_entry() eller Gtk.ComboBox.new_with_model_and_entry() för att skapa en Gtk.ComboBox-instans.

För en enkel lista över textval kan model-view-API:t för Gtk.ComboBox vara lite överväldigande. I detta fall är Gtk.ComboBoxText ett enkelt alternativ. Både Gtk.ComboBox och Gtk.ComboBoxText kan innehålla ett inmatningsfält.

15.1. Exempel

_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()