ウィンドウに スライダーが くわわる くわわる!!
前にふれたXAML(id:ABA:20050118#p1)のクロスプラットフォームの代替品として、とりあえずwxPythonを調べてみた。
wxPythonはクロスプラットフォームのGUIツールキットであるwxWidgetsのPythonバインドであり、シンプルで強力なスクリプト言語であるPythonを利用することで、簡単にクロスプラットフォームのGUIを構築できる、はずのものである。
とりあえずXAMLのサンプルと同様に、スライダーでRGBの数値を変化させると画面右にその色が表示されるColorScrollの簡易版を作ってみた。
from wxPython.wx import * class MainWindow(wxFrame): def __init__(self, parent, id, title): wxFrame.__init__(self, parent, wxID_ANY, title, size = (256, 128), style = wxDEFAULT_FRAME_STYLE) self.sizerTop = wxBoxSizer(wxHORIZONTAL) self.sizerLeft = wxBoxSizer(wxHORIZONTAL) self.sliders = [] for i in range(0, 3): self.sliders.append(wxSlider(self, id, 0, 0, 255, wxDefaultPosition, (32, 128), wxSL_VERTICAL)) self.sizerLeft.Add(self.sliders[i]) EVT_SCROLL(self.sliders[i], self.OnScroll) self.sizerTop.Add(self.sizerLeft) self.colorPanel = wxPanel(self, id, wxDefaultPosition, (128, 128)) self.sizerTop.Add(self.colorPanel) self.SetSizer(self.sizerTop) self.SetAutoLayout(1) self.sizerTop.Fit(self) self.RefreshColorPanel() self.Show(true) def OnScroll(self, e): self.RefreshColorPanel() def RefreshColorPanel(self): self.colorPanel.SetBackgroundColour( wxColour(self.sliders[0].GetValue(), self.sliders[1].GetValue(), self.sliders[2].GetValue())) self.colorPanel.Clear() def main(): app = wxPySimpleApp() frame = MainWindow(None, -1, "ColorScroll") app.MainLoop() if __name__ == '__main__': main()
……相変わらずPythonはなにかにつけself, self言わないといけないのがめんどくさいな。この点はRubyの方がいいよね。
wxPythonではsizerと呼ばれるJavaで言うレイアウトマネージャのようなものでGUI部品の配置を決めればいいらしい、のだが、上のコードのような使い方でいいのかいまいち自信がない。なんかウィンドウのリサイズに追随しないしなあ。どっか間違ってるのだろう。
sizerでパネルの配置を決め、その上に部品をAddしていくという使い方になるため、XAMLのような宣言的、HTMLライクな書き方はできない。GUIデザイナなしで複雑なGUIをいきなり書くのはたぶんつらいだろう。
で、これで一応動くものはできるのだが、このままだと当然Python処理系がある環境でしか動かない。なのでpy2exeを用いてこれをWindowsバイナリにする。
これにPythonスクリプトを食わせれば、Windowsバイナリと必要なdllなどがdistディレクトリ内に生成される。えーと、できあがったファイルサイズの合計は、7.93MB、ですか、はあ。
というわけで、とりあえず現状ではサイズ的にとても許容できるものではないので、採用は見送りだなあ。GUIの記述自体も劇的に楽になるというわけではなさげだし。wxRuby + Exerbでもたぶん同じような感じなんだろう。