リンク

2017年6月29日木曜日

pythonでGUIツールを作る 〜ToasterBox(トースターボックス)〜


今回は、ボタンを押すと下からニュッと飛び出してくるメッセージ系ウィジット「ToasterBox」をご紹介します。

「ToasterBox」はその名の通り、焼けたトーストが「チンっ」と飛び出てくることに由来しています。(大嘘)


面白そうなウィジットですよね!


環境
  • macOS Sierra 10.12.5
  • python 3.4
  • wxPython 4.0.0a3


スクリプト
# -*- coding: UTF-8 -*-

import wx
import wx.lib.agw.toasterbox as TB

class App(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(200, 200))

        p = wx.Panel(self, wx.ID_ANY)

        b = wx.Button(p, wx.ID_ANY, 'ボタン')
        b.Bind(wx.EVT_BUTTON, self.click)

        # レイアウト
        layout = wx.BoxSizer(wx.VERTICAL)
        layout.Add(b, flag=wx.ALL, border=10)
        p.SetSizer(layout)

        self.Show()

    def click(self, event):
        # マウス座標を取得
        (x, y) = wx.GetMousePosition()

        # ToasterBox
        toaster = TB.ToasterBox(self, tbstyle=TB.TB_SIMPLE)
        toaster.SetPopupBackgroundColour("pink")
        toaster.SetPopupPauseTime(3000)
        toaster.SetPopupText("見てくれて\nありがとう") 
        toaster.SetPopupSize(wx.Size(80, 80))
        toaster.SetPopupPosition(wx.Position(x + 10, y + 10))
        toaster.SetPopupTextFont(wx.Font(10, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False, 'メイリオ'))

        toaster.Play()


if __name__ == "__main__":
    app = wx.App()
    App(None, wx.ID_ANY, 'タイトル')
    app.MainLoop()


実行結果
いつもありがとうございます。



解説
トースターボックスを使用するには、wx.lib.agwパッケージのtoasterboxクラスをインポートします。
今回は簡略化するため、asを用いて「TB」としました。
import wx.lib.agw.toasterbox as TB

続いてインスタンス化です。
今回はボタンがクリックされた時にインスタンス化を行うようになっています。
toaster = TB.ToasterBox(self, tbstyle=TB.TB_SIMPLE)
この部分でインスタンス化を行なっています。
この時の引数は(親ウィジット、TBスタイル)です。

TBスタイルは次の2種類から選択できます。
  • TB_SIMPLE
  • TB_COMPLEX
TB_SIMPLEは背景画像やテキストを指定することができます。
TB_COMPLEXはAddPanelメソッドを使用することでToasterBox内にパネルを設置することができ、ボタンなどのウィジットを追加することができます。

tbstyle比較

今回は省略していますが、他にも「windowstyle」「closingstyle」「scrollType」を指定することができます。

windowstyle
windowstyleはトースターボックスの外観に関するスタイルで、次の2つがあります。
  • TB_DEFAULT_STYLE
  • TB_CAPTION
TB_DEFAULT_STYLEは上の画像のように周りに何もない状態です。
TB_CAPTIONはフレームやダイアログのように周りに枠があり、タイトルや×ボタンが表示されます。

windowstyle比較

closingstyle
closingstyleはトースターボックスを閉じるタイミングに関するスタイルで、次の2つがあります。
  • TB_ONTIME
  • TB_ONCLICK
TB_ONTIMEは指定時間が経過するまで表示されます。
TB_ONCLICKは指定時間の経過を待たずとも、枠内をクリックすると閉じることができます。


scrollType
scrollTypeはトースターボックスの表示方法に関するスタイルで、次の3つがあります。
  • TB_SCR_TYPE_DU
  • TB_SCR_TYPE_UD
  • TB_SCR_TYPE_FADE
TB_SCR_TYPE_DUは下から上へ、TB_SCR_TYPE_UDは上から下へ、TB_SCR_TYPE_FADEはジワーと出てきて、ジワーと消えます。



メソッド紹介
使用頻度が高そうなメソッドを厳選してご紹介します。
# テキストを設定する(tbstyleがTB_SIMPLEの時のみ)
toaster.SetPopupText("見てくれて\nありがとう") 

# 背景色を設定する(tbstyleがTB_SIMPLEの時のみ)
toaster.SetPopupBackgroundColour("pink")

# 画像を設定する(tbstyleがTB_SIMPLEの時のみ)
toaster.SetPopupBitmap(wx.Bitmap("image.png"))

# 表示時間をミリ秒で設定する
toaster.SetPopupPauseTime(3000)

# 表示位置を設定する(左上角の位置)
toaster.SetPopupPosition(wx.Position(10, 10))

# サイズを設定する
toaster.SetPopupSize(wx.Size(80, 80))

# タイトルを設定する
toaster.SetTitle("タイトル")


参考
・公式リファレンス:wx.lib.agw.toasterbox.ToasterBox


まとめ
トースターボックスはよく使われるダイアログとは一味違っていて、動きがあるぶん、作る側も使う側も楽しめるようなウィジットです。

ボタンやテキストコントロールの設置も可能ですので、アイデア次第で色々と活躍してくれるかもしれません。


2 件のコメント:

  1. いえ、これは完全にポップアップトースターの チンッ と飛び出ることが由来ですね。

    返信削除
    返信
    1. コメントありがとうございます!
      実際、私にも完全にそうとしか思えません(笑)

      削除