进度条

Gtk.ProgressBar 通常用来显示一个较长时间操作的进度信息,它给操作正在 进行中提供了一个视觉的效果。 Gtk.ProgressBar 有两种模式: percentage modeactivity mode

当程序知道需要执行的工作的工作量(例如从一个文件读取固定字节数)并且可以监视进度时, 可以使用 Gtk.ProgressBarpercentage mode ,这样用户可以看到一个正在前进的进度条 ——指示任务完成的百分比,这种模式程序要周期性地调用 Gtk.ProgressBar.set_fraction() 来更新进度条,传递一个介于0和1之间的值表示新的百分比。

当一个程序不知道任务的工作量时,可以使用 activity mode ,这种模式会显示一个 前后移动的进度块显示任务正在进行中。这种模式下,应用程序要周期性地调用 Gtk.ProgressBar.pulse() 来更新进度条,你也可以通过 Gtk.ProgressBar.set_pulse_step() 设置每次进度前进的数量。

默认情况下, Gtk.ProgressBar 水平的从左向右显示进度,但你也可以通过调用 Gtk.ProgressBar.set_orientation() 来改变进度条显示的方向是水平还是竖直。 进度条前进的方向则可以使用 Gtk.ProgressBar.set_inverted() 来改变。 Gtk.ProgressBar 也可以通过 Gtk.ProgressBar.set_text()Gtk.ProgressBar.set_show_text() 来设置显示一些文本信息。

ProgressBar 对象

class Gtk.ProgressBar
set_fraction(fraction)

使进度条 填充 给定百分比的进度。 fraction 应该是在0.0和1.0之间,包含0和1。

set_pulse_step(fraction)

设置每次调用 pulse() 进度条滑块移动的进度占总进度的百分比。

pulse()

一些进度完成了,但是程序不知道完成了多少时调用此函数使进度条进入 activity mode ,这时会有一个进度滑块前后地移动。每次调用 pulse() 使滑块向前移动一点(每次pulse移动的数量由 set_pulse_step() 来设置)。

set_orientation(orientation)

设置进度条显示的方向, orientation 可以是一下其中之一:

  • Gtk.Orientation.HORIZONTAL
  • Gtk.Orientation.VERTICAL
set_show_text(show_text)

设置是否在进度条上叠加显示一些文本信息。显示的信息或者是 “text” 属性的值( set_text() 设置),或者若其为 None ,会显示进度的百分比。

set_text(text)

使给定的 text 叠加显示到进度条上。

set_inverted(inverted)

进度条的方向一般是从左向右前进,inverted使进度条前进的方向翻转。

Example

../../_images/progressbar_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
#!/usr/bin/env python
#coding:utf-8

from gi.repository import Gtk, GObject

class  ProgressBarWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title='ProgressBar Demo')
        self.set_border_width(10)

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

        self.progressbar = Gtk.ProgressBar()
        vbox.pack_start(self.progressbar, True, True, 0)

        button = Gtk.CheckButton('Show text')
        button.connect('toggled', self.on_show_text_toggled)
        vbox.pack_start(button, True, True, 0)

        button = Gtk.CheckButton('Activity mode')
        button.connect('toggled', self.on_activity_mode_toggled)
        vbox.pack_start(button, True, True, 0)

        button = Gtk.CheckButton('Right to Left')
        button.connect('toggled', self.on_right_to_left_toggled)
        vbox.pack_start(button, True, True, 0)

        self.timeout_id = GObject.timeout_add(50, self.on_timeout, None)
        self.activity_mode = False

    def on_show_text_toggled(self, button):
        show_text = button.get_active()
        if show_text:
            text = 'some text'
        else:
            text = None
        self.progressbar.set_text(text)
        self.progressbar.set_show_text(show_text)

    def on_activity_mode_toggled(self, button):
        self.activity_mode = button.get_active()
        if self.activity_mode:
            self.progressbar.pulse()
        else:
            self.progressbar.set_fraction(0.0)

    def on_right_to_left_toggled(self, button):
        value = button.get_active()
        self.progressbar.set_inverted(value)

    def on_timeout(self, user_data):
        '''
        Update value on the progress bar
        '''
        if self.activity_mode:
            self.progressbar.pulse()
        else:
            new_value = self.progressbar.get_fraction()+0.01
            if new_value>1:
                new_value = 0.0

            self.progressbar.set_fraction(new_value)

        # time out function, return True so that it will be called continuedly
        return True

win = ProgressBarWindow()
win.connect('delete-event', Gtk.main_quit)
win.show_all()
Gtk.main()