11. ProgressBar
Gtk.ProgressBar
används typiskt för att visa förloppet för en operation som pågår länge. Den tillhandahåller en visuell ledtråd om att bearbetning pågår. Gtk.ProgressBar
kan användas i två olika lägen: procentläge och aktivitetsläge.
Då ett program kan avgöra hur mycket arbete som behöver utföras (t.ex. läsa ett fast antal byte från en fil) och kan övervaka sina framsteg, så kan det använda Gtk.ProgressBar
i procentläge, så ser användaren en växande stapel som indikerar procentdelen av arbetet som har slutförts. I detta läge behöver programmet anropa Gtk.ProgressBar.set_fraction()
periodiskt för att uppdatera förloppsindikatorn, och skicka med ett flyttal mellan 0 och 1 för att tillhandahålla det nya procentvärdet.
Då ett program inte har något exakt sätt att veta mängden arbete det måste utföra, kan det använda aktivitetsläge, som visar aktivitet med ett block som rör sig fram och tillbaka i förloppsområdet. I detta läget behöver programmet anropa Gtk.ProgressBar.pulse()
periodiskt för att uppdatera förloppsindikatorn. Du kan också välja stegstorleken, med metoden Gtk.ProgressBar.set_pulse_step()
.
Som standard är Gtk.ProgressBar
horisontell och vänster-till-höger, men du kan ändra den till en vertikal förloppsindikator genom att använda metoden Gtk.ProgressBar.set_orientation()
. Att ändra riktningen som förloppsindikatorn växer kan göras med Gtk.ProgressBar.set_inverted()
. Gtk.ProgressBar
kan också innehålla text som kan ställas in genom att anropa Gtk.ProgressBar.set_text()
och Gtk.ProgressBar.set_show_text()
.
11.1. Exempel
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()