Ir para o conteúdo

Python e GTK 3: Como utilizar um arquivo de interface do Gnome Glade

Como utilizar um arquivo de interface gerado pelo Gnome Glade com a linguagem de programação Python.

Código

Cuidado

Lembre-se de adequar a localização do arquivo de interface e ícones.

Glade

 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
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
    <requires lib="gtk+" version="3.24"/>
    <object class="GtkApplicationWindow" id="MainWindow">
        <property name="can_focus">False</property>
        <property name="default_width">683</property>
        <property name="default_height">384</property>
        <property name="title" translatable="yes">Signals e Slots Glade</property>
        <child>
            <placeholder/>
        </child>
        <child>
            <object class="GtkBox" id="vbox">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="orientation">vertical</property>
                <property name="border_width">12</property>
                <child>
                    <object class="GtkEntry" id="entry">
                        <property name="visible">True</property>
                        <property name="can_focus">True</property>
                        <property name="placeholder_text" translatable="yes">Digite algo</property>
                    </object>
                    <packing>
                        <property name="expand">False</property>
                        <property name="fill">True</property>
                        <property name="position">0</property>
                    </packing>
                </child>
                <child>
                    <object class="GtkLabel" id="label">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="label" translatable="yes">Este texto será alterado!</property>
                    </object>
                    <packing>
                        <property name="expand">True</property>
                        <property name="fill">True</property>
                        <property name="position">1</property>
                    </packing>
                </child>
                <child>
                    <object class="GtkButton" id="button">
                        <property name="label" translatable="yes">Clique Aqui</property>
                        <property name="visible">True</property>
                        <property name="can_focus">True</property>
                        <property name="receives_default">True</property>
                        <signal name="clicked" handler="on_button_clicked" swapped="no"/>
                    </object>
                    <packing>
                        <property name="expand">False</property>
                        <property name="fill">True</property>
                        <property name="position">2</property>
                    </packing>
                </child>
            </object>
        </child>
    </object>
</interface>

Python

Classe

 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
# -*- coding: utf-8 -*-
"""Python e GTK 3: Como interagir com arquivo de interface do Gnome Glade."""

import gi

gi.require_version(namespace='Gtk', version='3.0')

from gi.repository import Gtk


class Handler:

    def __init__(self):

        # Acessando widgets do arquivo de interface.
        self.label = builder.get_object(name='label')
        self.entry = builder.get_object(name='entry')

    def on_button_clicked(self, button):
        """Método é chamado quando o botão da interface é pressionado.

        Caso haja algum texto/caractere no campo de entrada de texto o
        texto será exibido no label da interface, caso não haja
        é exibida outra mensagem.

        :param button: Instância do objeto ``Gtk.Button()``. Basicamente
        informações do botão que foi pressionado.
        """
        if self.entry.get_text():
            self.label.set_label(str=self.entry.get_text())
        else:
            self.label.set_label(str='Digite algo no campo acima!')


if __name__ == '__main__':
    builder = Gtk.Builder.new()
    # Caminho até o arquivo de inteface.
    builder.add_from_file(filename='MainWindow.glade')
    # Conectando os sinais da interface com os métodos criados no Python.
    builder.connect_signals(obj_or_map=Handler())

    win = builder.get_object(name='MainWindow')
    win.connect('destroy', Gtk.main_quit)
    win.show_all()

    Gtk.main()

Dicionário

 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
# -*- coding: utf-8 -*-
"""Signal e Slots."""


import gi

gi.require_version(namespace='Gtk', version='3.0')

from gi.repository import Gtk


def on_button_clicked(button):
    """Método é chamado quando o botão da interface é pressionado.

    Caso haja algum texto/caractere no campo de entrada de texto o
    texto será exibido no label da interface, caso não haja
    é exibida outra mensagem.

    :param button: Instância do objeto ``Gtk.Button()``. Basicamente
    informações do botão que foi pressionado.
    """
    if entry.get_text():
        label.set_label(str=entry.get_text())
    else:
        label.set_label(str='Digite algo no campo acima!')


if __name__ == '__main__':
    # Dicionário para registrar os métodos.
    # Nome da chave deve ser o mesmo que foi criado no arquivo de interface.
    handlers = {
        'on_button_clicked': on_button_clicked
    }

    builder = Gtk.Builder.new()
    builder.add_from_file(filename='window-with-signal.glade')
    # Conectando os sinais da interface com os métodos criados no Python.
    builder.connect_signals(obj_or_map=handlers)

    # Acessando os widgets do arquivo de inteface.
    label = builder.get_object(name='label')
    entry = builder.get_object(name='entry')

    win = builder.get_object(name='MainWindow')
    win.connect('destroy', Gtk.main_quit)
    win.show_all()

    Gtk.main()