試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

PyGTKでシステムトレイアイコンの隣のポップアップウィンドウにスライダーを表示する(前半)

ではシステムトレイのアイコンの隣に小さなポップアップウィンドウを表示してみたが、ここにスライダーを付けてみることにする。

オブジェクト

ウィンドウ内に実際に配置する部品としては、その向きによって

の2つがある。これらは

といったクラスを継承していて、これらに含まれるメンバ関数により幾つかの設定を行う。

設定

種類(VScale/HScale)と方向など
  • gtk.VScaleでは下方向が大きい値となるが、gtk.Rangeオブジェクトのメンバ関数set_inverted()でTrueを指定すると上方向が大きい値になる
  • (gtk.Scaleオブジェクトのメンバ関数set_draw_value()でFalseを指定しないとき)同オブジェクトのメンバ関数set_value_pos()で値の表示位置(スライダーの上下左右のいずれか)を指定

set_value_pos()に渡す値は位置に応じた定数gtk.POS_[RIGHT/LEFT/TOP/BOTTOMのいずれか]となる。下の例では、画面上のシステムトレイアイコンの座標によってスライダーの種類と値の表示位置を変えている。コードは「PyGTKでシステムトレイのアイコンの隣にポップアップウィンドウを作成する(後半)」をもとにしている。

# システムトレイアイコンが縦方向に並ぶ場合(パネルが左右端にある場合など)
if orientation == gtk.ORIENTATION_VERTICAL:
  scale = gtk.HScale()
  # 画面右端にある場合は左に表示する
  # アイコンのX座標 + 幅 + (幅 x 5)
  # つまり「アイコンのX座標 + 幅 x (1 + 5)」を画面幅と比較
  if area.x + area.width * (1 + 5) > screen.get_width():
    (中略)
    scale.set_value_pos(gtk.POS_RIGHT)
  # それ以外は右に表示する
  else:
    (中略)
    scale.set_value_pos(gtk.POS_LEFT)
# システムトレイアイコンが横方向に並ぶ場合(パネルが上下端にある場合など)
else:
  scale = gtk.VScale()
  scale.set_inverted(True)  # 上が大きい値になるようにする
  # 画面上端にある場合は下に表示する
  if area.y < area.height * 8:
    (中略)
    scale.set_value_pos(gtk.POS_TOP)
  # それ以外は上に表示する
  else:
    (中略)
    scale.set_value_pos(gtk.POS_BOTTOM)

小数点以下の表示

スライダーの横に表示される現在値は、そのままでは小数点以下も表示されるが、gtk.Scaleオブジェクトのメンバ関数set_digits()でその桁数を変更できる。

scale.set_digits(0)  # 小数点以下なし
範囲など

gtk.Rangeオブジェクトのメンバ関数set_adjustment()で範囲などのデータを持つgtk.Adjustmentオブジェクトを作成して指定する。

  • value: 初期値
  • lower: 最小値
  • upper: 最大値
  • step_incr: マウスのホイールでの増減量に影響
  • page_incr: マウスでスライダー内のつまみと離れた場所をクリックしたときの増減量に影響
  • page_size: スライダーを使用した場合は0を指定しないと有効範囲がおかしくなる?
scale.set_adjustment(gtk.Adjustment(value=50, lower=0, upper=100, step_incr=1, page_incr=5, page_size=0))
値変更のシグナルとポリシー設定
  • スライダー値が変更されると「value_changed」というシグナル(イベント)が発生する
  • gtk.Rangeオブジェクトのメンバ関数set_update_policy()で、スライダーをどのように動かしたときにそれを通知する(「value_changed」のシグナルを発生させる)かを設定する
scale.set_update_policy(gtk.UPDATE_CONTINUOUS)      # ドラッグして移動すると値を反映
#scale.set_update_policy(gtk.UPDATE_DELAYED)        # スライダーのドラッグ中に停止するか止めると反映
#scale.set_update_policy(gtk.UPDATE_DISCONTINUOUS)  # スライダーを止めて離してから反映

scale.connect("value_changed", [ハンドラ])

(「システムトレイアイコンの隣のポップアップウィンドウにスライダーを表示する(後半)」に続く)

関連記事:

参考URL:

使用したバージョン: