wxglade使ってpythonのGUI


なかなか、進まないpythonアプリに手を付けてみることに。 肝心の中身のアルゴリズムは、まだなんも考えてないんだけど、ガワの部分はだんだんと目処が立ってきたっぽい。 とりあえず、気づいたことメモしとく。

・ソースコード中の# begin wxGlade: extracodeと# end wxGladeの間に書いた部分は後でgenerate codeしても消えない。ウィジェットで叩くイベントとかは、この間に書くと良い。

・wxgladeがはくwxgなるファイルはxmlみたくなっていて、そっちを編集してもいけそう。ただ、変なとこいぢるとwxgladeで開けられなくなるので、いぢりすぎは禁物。 いちお、長たらしいけどコードも貼っとく。

[python]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.3 on Mon Jun 22 16:20:41 2009

import wx
import wx.grid

# begin wxGlade: extracode
# end wxGlade

class Myforman(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: Myforman.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.panel_1 = wx.Panel(self, -1)
self.sizer_2_staticbox = wx.StaticBox(self.panel_1, -1, "")

# Menu Bar
self.kforman_menubar = wx.MenuBar()
wxglade_tmp_menu = wx.Menu()
self.kforman_menubar.Append(wxglade_tmp_menu, _(u"ファイル"))
wxglade_tmp_menu = wx.Menu()
self.kforman_menubar.Append(wxglade_tmp_menu, _(u"ヘルプ"))
self.SetMenuBar(self.kforman_menubar)
# Menu Bar end
self.label_6 = wx.StaticText(self.panel_1, -1, _(u"人工林資源予測システム"))
self.label_1 = wx.StaticText(self.panel_1, -1, _("formak"), style=wx.ALIGN_CENTRE)
self.button_2 = wx.Button(self.panel_1, -1, _(u"林分情報入力画面"))
self.button_1 = wx.Button(self.panel_1, -1, _(u"立木情報入力画面"))
self.button_3 = wx.Button(self.panel_1, -1, _(u"将来の間伐率入力画面"))
self.button_4 = wx.Button(self.panel_1, -1, _(u"シミュレート"))

self.__set_properties()
self.__do_layout()
# end wxGlade

self.button_2.Bind(wx.EVT_BUTTON, self.Showframe2)
self.button_1.Bind(wx.EVT_BUTTON, self.Showframe1)

def Showframe1(self,e):
win = Myforman1(self,-1)
win.Show()

def Showframe2(self,e):
win = Myforman2(self,-1)
win.Show()

def __set_properties(self):
# begin wxGlade: Myforman.__set_properties
self.SetTitle(_(u"人工林資源予測システム formak"))
self.button_2.SetMinSize((150, 30))
self.button_1.SetMinSize((150, 30))
self.button_3.SetMinSize((150, 30))
self.button_4.SetMinSize((150, 30))
# end wxGlade

def __do_layout(self):
# begin wxGlade: Myforman.__do_layout
sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
sizer_2 = wx.StaticBoxSizer(self.sizer_2_staticbox, wx.VERTICAL)
sizer_2.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
sizer_2.Add(self.label_1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 8)
sizer_2.Add(self.button_2, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
sizer_2.Add(self.button_1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
sizer_2.Add(self.button_3, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
sizer_2.Add(self.button_4, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
self.panel_1.SetSizer(sizer_2)
sizer_1.Add(self.panel_1, 1, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 8)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
self.Layout()
self.Centre()
# end wxGlade

# end of class Myforman

class Myforman1(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: Myforman1.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)

# Menu Bar
self.frame_1_menubar = wx.MenuBar()
wxglade_tmp_menu = wx.Menu()
self.frame_1_menubar.Append(wxglade_tmp_menu, _("item"))
wxglade_tmp_menu = wx.Menu()
self.frame_1_menubar.Append(wxglade_tmp_menu, _("item"))
self.SetMenuBar(self.frame_1_menubar)
# Menu Bar end
self.grid_1 = wx.grid.Grid(self, -1, size=(1, 1))

self.__set_properties()
self.__do_layout()
# end wxGlade

def __set_properties(self):
# begin wxGlade: Myforman1.__set_properties
self.SetTitle(_(u"立木情報入力画面"))
self.grid_1.CreateGrid(30, 3)
self.grid_1.SetColLabelValue(0, _(u"個体番号"))
self.grid_1.SetColLabelValue(1, _(u"胸高直径"))
self.grid_1.SetColLabelValue(2, _(u"樹高"))
self.grid_1.SetMinSize((400,500))
# end wxGlade

def __do_layout(self):
# begin wxGlade: Myforman1.__do_layout
sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
sizer_3.Add(self.grid_1, 1, wx.EXPAND, 0)
self.SetSizer(sizer_3)
sizer_3.Fit(self)
self.Layout()
# end wxGlade

# end of class Myforman1

class Myforman2(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: Myforman2.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.label_2 = wx.StaticText(self, -1, _(u"樹種名nカタカナで記入してください。"))
self.text_ctrl_5 = wx.TextCtrl(self, -1, "")
self.label_3 = wx.StaticText(self, -1, _(u"林齢n半角数字で記入してください"), style=wx.ALIGN_CENTRE)
self.text_ctrl_6 = wx.TextCtrl(self, -1, "")
self.label_4 = wx.StaticText(self, -1, _(u"ha当たりl立木本数n半角数字で記入してください。n"))
self.text_ctrl_7 = wx.TextCtrl(self, -1, "")
self.label_5 = wx.StaticText(self, -1, _(u"備考nその他特記すべきことを書いてください"))
self.text_ctrl_1 = wx.TextCtrl(self, -1, "")
self.button_5 = wx.Button(self, -1, _("O K"))

self.__set_properties()
self.__do_layout()
# end wxGlade

def __set_properties(self):
# begin wxGlade: Myforman2.__set_properties
self.SetTitle(_(u"林分情報入力画面"))
self.label_2.SetForegroundColour(wx.Colour(255, 255, 255))
self.label_3.SetForegroundColour(wx.Colour(255, 255, 255))
self.label_4.SetForegroundColour(wx.Colour(255, 255, 255))
self.label_5.SetForegroundColour(wx.Colour(255, 255, 255))
# end wxGlade

def __do_layout(self):
# begin wxGlade: Myforman2.__do_layout
grid_sizer_1 = wx.GridSizer(5, 2, 2, 6)
grid_sizer_1.Add(self.label_2, 0, 0, 0)
grid_sizer_1.Add(self.text_ctrl_5, 0, 0, 2)
grid_sizer_1.Add(self.label_3, 0, 0, 0)
grid_sizer_1.Add(self.text_ctrl_6, 0, 0, 2)
grid_sizer_1.Add(self.label_4, 0, 0, 0)
grid_sizer_1.Add(self.text_ctrl_7, 0, wx.ALL, 2)
grid_sizer_1.Add(self.label_5, 0, 0, 0)
grid_sizer_1.Add(self.text_ctrl_1, 0, 0, 2)
grid_sizer_1.Add(self.button_5, 0, wx.RIGHT|wx.ALIGN_RIGHT, 0)
self.SetSizer(grid_sizer_1)
grid_sizer_1.Fit(self)
self.Layout()
# end wxGlade

# end of class Myforman2

class MyApp(wx.App):
def OnInit(self):
wx.InitAllImageHandlers()
kforman = Myforman(None, -1, "")
self.SetTopWindow(kforman)
kforman.Show()
return 1

# end of class MyApp

if __name__ == "__main__":
import gettext
gettext.install("app") # replace with the appropriate catalog name

app = MyApp(0)
app.MainLoop()

[/python]

起動するとこんな感じ。


うちのubuntuで動かすとこんな感じ。 OSXは試してないけど、多分動くと思います。今のところはマルチプラットフォーム。てかwinのフォントしょぼいな。
今後の問題としては・・・

・winでは、python,wxpythonをインストールしないといけないので、ちと面倒くさい。できればフローズンバイナリにしたい。

・グラフをどうやって書こう。gnuplotとかRとかpychartとかmatplotlibとかいろいろありそう。できればRにrpyって方法がなれてるからいいんだけど、いろいろバギーな気がする。matplotlibあたりが手堅いか?

・wxpythonは印刷まわりがかなり弱そう。となるとHTMLに書き出してブラウザで開いて印刷??なんかいい方法ないかなー