Python GTK+3 チュートリアル

10. プログレスバー

翻訳して勉強するGtkチュートリアル第10章 ProgressBar です。


Gtk.ProgressBar は、一般的には長時間実行されている操作の進捗状況を表示するために使用されます。これは、処理が進行中であることを視覚的に示す手がかりとなります。Gtk.ProgressBar は、パーセンテージ・モードとアクティビティ・モードの2つのモードで使用できます。

アプリケーションがどのくらい作業を行う必要があるか (例えば、ファイルから一定のバイト数を読み込むなど) を判断し、その進捗状況を監視することができる場合、Gtk.ProgressBar をパーセンテージ・モードで使用することができ、ユーザは作業が完了した割合を示すバーの伸長を確認できます。このモードでは、アプリケーションは定期的に Gtk.ProgressBar.set_fraction() を呼び出して進捗状況を更新し、0から1の間のフロート値渡して新しいパーセンテージ値を提供する必要があります。

アプリケーションが作業量を正確に知ることができない場合は、進捗を示す領域内を前後に移動するブロックによって活動状況を表示するアクティビティ・モードを使用することができます。このモードでは、アプリケーションは定期的に 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() を呼び出すことで設定できます。

10.1. 例

プログレスバー
# tut10.py
# プログレスバー

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib


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 = GLib.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

            self.progressbar.set_fraction(new_value)

        # As this is a timeout function, return True so that it
        # continues to get called
        return True


win = ProgressBarWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()


関連記事