画面に取り付けたプログレスバーを動かしたい

画面デザインのWindows Formsにより、プログレスバーを設置することができる。
このプログレスバーを動かすにはどうするか?ここではタイマーを使ってプログレスバーの動きをアニメーション表示する。もっと実用的なプログラムに応用するにはスレッドを使うことになるのだろう。

どのように書けばいいか、IronPythonのコードを探してもまず見つからないので、C#のコードを代わりに探して参考にする。メソッドやプロパティはほぼ同じなので、少しの試行錯誤の後に動くコードが書ける。

今回のコードは以下の通り。

import System.Drawing
import System.Windows.Forms

from System.Drawing import *
from System.Windows.Forms import *

class MainForm(Form):
    def __init__(self):
        self.InitializeComponent()
 
    def InitializeComponent(self):
        self._statusStrip1 = System.Windows.Forms.StatusStrip()
        self._toolStripProgressBar1 = System.Windows.Forms.ToolStripProgressBar()
        self._button1 = System.Windows.Forms.Button()
        self._statusStrip1.SuspendLayout()
        self.SuspendLayout()
        #
        # statusStrip1
        #
        self._statusStrip1.Items.AddRange(System.Array[System.Windows.Forms.ToolStripItem](
            [self._toolStripProgressBar1]))
        self._statusStrip1.Location = System.Drawing.Point(0, 240)
        self._statusStrip1.Name = "statusStrip1"
        self._statusStrip1.Size = System.Drawing.Size(284, 22)
        self._statusStrip1.TabIndex = 0
        self._statusStrip1.Text = "statusStrip1"
        #
        # toolStripProgressBar1
        #
        self._toolStripProgressBar1.Name = "toolStripProgressBar1"
        self._toolStripProgressBar1.Size = System.Drawing.Size(100, 16)
        self._toolStripProgressBar1.Minimum = 0   #最小値を指定
        self._toolStripProgressBar1.Maximum = 100  #最大値を指定
        self.counter = 0     #カウンターを定義
        #
        # button1
        #
        self._button1.Location = System.Drawing.Point(45, 68)
        self._button1.Name = "button1"
        self._button1.Size = System.Drawing.Size(193, 54)
        self._button1.TabIndex = 1
        self._button1.Text = "push here to start progressBar"
        self._button1.UseVisualStyleBackColor = True
        self._button1.Click += self.Button1Click #ボタンを押したときタイマーをスタートする
        #
        # MainForm
        #
        self.ClientSize = System.Drawing.Size(284, 262)
        self.Controls.Add(self._button1)
        self.Controls.Add(self._statusStrip1)
        self.Name = "MainForm"
        self.Text = "test"
        self._statusStrip1.ResumeLayout(False)
        self._statusStrip1.PerformLayout()
        self.ResumeLayout(False)
        self.PerformLayout()

    def Button1Click(self, sender, e):
        tm = Timer()
        tm.Interval = 100  #間隔を100ミリ秒で指定する
        tm.Start()         #タイマーを開始する
        tm.Tick += self.tm_Tick  #イベントハンドラを登録する
  
    def tm_Tick(self, sender, e):
        self.counter += 1   #カウンタを1ずつ増やす。最大値(100)になったら0に戻す
        if self.counter >= 100:
            self.counter = 0
        self._toolStripProgressBar1.Value = self.counter  #カウンタの数値をバーの長さとする

画面のボタンを押すと、プログレスバーに色が付き始める。満タンになると再び0から繰り返しになる。


プログラムを実行するには、MainForm.pyとともに以下のProgram.pyが必要。

import clr
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')

from System.Windows.Forms import Application
import MainForm

Application.EnableVisualStyles()
form = MainForm.MainForm()
Application.Run(form)