11. ProgressBar

O Gtk.ProgressBar é normalmente usado para exibir o progresso de uma operação longa. Ele fornece uma pista visual de que o processamento está em andamento. O Gtk.ProgressBar pode ser usado em dois modos diferentes: modo de porcentagem e modo de atividade.

Quando um aplicativo pode determinar quanto trabalho precisa ocorrer (por exemplo, ler um número fixo de bytes de um arquivo) e monitorar seu progresso, ela pode usar Gtk.ProgressBar no modo percentage e o usuário vê uma barra crescente indicando a porcentagem do trabalho que foi concluído. Neste modo, o aplicativo é necessário para chamar Gtk.ProgressBar.set_fraction() periodicamente para atualizar a barra de progresso, passando um ponto flutuante entre 0 e 1 para fornecer o novo valor percentual.

Quando um aplicativo não tem uma maneira precisa de saber a quantidade de trabalho a ser feito, ele pode usar o modo de atividade, que mostra a atividade de um bloco se movendo para frente e para trás na área de progresso. Neste modo, o aplicativo é necessário para chamar Gtk.ProgressBar.pulse() periodicamente para atualizar a barra de progresso. Você também pode escolher o tamanho do passo, com o método Gtk.ProgressBar.set_pulse_step().

Por padrão, Gtk.ProgressBar é horizontal e da esquerda para a direita, mas você pode alterá-lo para uma barra de progresso vertical usando o método Gtk.ProgressBar.set_orientation(). Mudar a direção da barra de progresso pode ser feito usando Gtk.ProgressBar.set_inverted(). Gtk.ProgressBar também pode conter texto que pode ser definido chamando Gtk.ProgressBar.set_text() e Gtk.ProgressBar.set_show_text().

11.1. Exemplo

_images/progressbar_example.png
 1import gi
 2
 3gi.require_version("Gtk", "3.0")
 4from gi.repository import Gtk, GLib
 5
 6
 7class ProgressBarWindow(Gtk.Window):
 8    def __init__(self):
 9        super().__init__(title="ProgressBar Demo")
10        self.set_border_width(10)
11
12        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
13        self.add(vbox)
14
15        self.progressbar = Gtk.ProgressBar()
16        vbox.pack_start(self.progressbar, True, True, 0)
17
18        button = Gtk.CheckButton(label="Show text")
19        button.connect("toggled", self.on_show_text_toggled)
20        vbox.pack_start(button, True, True, 0)
21
22        button = Gtk.CheckButton(label="Activity mode")
23        button.connect("toggled", self.on_activity_mode_toggled)
24        vbox.pack_start(button, True, True, 0)
25
26        button = Gtk.CheckButton(label="Right to Left")
27        button.connect("toggled", self.on_right_to_left_toggled)
28        vbox.pack_start(button, True, True, 0)
29
30        self.timeout_id = GLib.timeout_add(50, self.on_timeout, None)
31        self.activity_mode = False
32
33    def on_show_text_toggled(self, button):
34        show_text = button.get_active()
35        if show_text:
36            text = "some text"
37        else:
38            text = None
39        self.progressbar.set_text(text)
40        self.progressbar.set_show_text(show_text)
41
42    def on_activity_mode_toggled(self, button):
43        self.activity_mode = button.get_active()
44        if self.activity_mode:
45            self.progressbar.pulse()
46        else:
47            self.progressbar.set_fraction(0.0)
48
49    def on_right_to_left_toggled(self, button):
50        value = button.get_active()
51        self.progressbar.set_inverted(value)
52
53    def on_timeout(self, user_data):
54        """
55        Update value on the progress bar
56        """
57        if self.activity_mode:
58            self.progressbar.pulse()
59        else:
60            new_value = self.progressbar.get_fraction() + 0.01
61
62            if new_value > 1:
63                new_value = 0
64
65            self.progressbar.set_fraction(new_value)
66
67        # As this is a timeout function, return True so that it
68        # continues to get called
69        return True
70
71
72win = ProgressBarWindow()
73win.connect("destroy", Gtk.main_quit)
74win.show_all()
75Gtk.main()