分割ウインドウな例

2ペインのアプリケーション

tags:python, gui, tips
created:2007-02-05T20:24:24

2ペインの例

ファイルリスト

  • resource.xrc
  • split.py
  • wx_utils.py
  • setup.py
  • main_icon.ico
  • main_icon.py

リソース内容

これはXRCedを使って編集した結果です。

resource.xrc

<?xml version="1.0" encoding="utf-8"?>
<resource>
  <object class="wxMenuBar" name="MainMenubar">
    <object class="wxMenu">
      <label>ファイル(&amp;F)</label>
      <object class="wxMenuItem" name="wxID_EXIT">
        <label>終了(&amp;X)</label>
        <accel>Alt+F4</accel>
      </object>
    </object>
    <object class="wxMenu">
      <label>ヘルプ(&amp;H)</label>
      <object class="wxMenuItem" name="wxID_ABOUT">
        <label>情報(&amp;I)</label>
      </object>
    </object>
  </object>
  <object class="wxFrame" name="MainFrame">
    <title>The Sample Application Ver. 1.0.0</title>
    <object class="wxToolBar">
      <object class="tool" name="wxID_EXIT">
        <bitmap stock_id="wxART_QUIT"></bitmap>
      </object>
      <object class="separator"/>
      <object class="tool" name="wxID_ABOUT">
        <bitmap stock_id="wxART_TICK_MARK"></bitmap>
      </object>
      <style>wxTB_FLAT</style>
    </object>
    <object class="wxSplitterWindow" name="Splitter">
      <object class="wxTreeCtrl" name="TreeCtrl">
        <style>wxTR_HAS_BUTTONS|wxTR_TWIST_BUTTONS|wxTR_LINES_AT_ROOT</style>
      </object>
      <object class="wxNotebook" name="NoteBook">
        <object class="notebookpage">
          <label>Page1</label>
          <object class="wxPanel"/>
        </object>
        <object class="notebookpage">
          <label>Page2</label>
          <object class="wxPanel"/>
        </object>
      </object>
      <orientation>vertical</orientation>
    </object>
    <object class="wxStatusBar">
      <style>wxST_SIZEGRIP</style>
    </object>
    <bg>#FFFFFF</bg>
  </object>
</resource>

メインコード

split.py

#!/usr/bin/local/python
# -*- coding: utf-8 -*-

import sys
import os
import wx
import wx_utils
from wx_utils import XRC, XRCID, XRCCTRL

#generated by follow command.
#img2py.bat -i main.ico main_icon.py
import main_icon

class MainFrame(wx.Frame):
  u"""MainFrame class deffinition.
  """
  binder = wx_utils.bind_manager()

  def __init__(self, parent=None):
    pre = wx.PreFrame()
    XRC().LoadOnFrame(pre, parent, 'MainFrame')
    self.PostCreate(pre)
    self.SetIcon(main_icon.getIcon())
    self.SetMenuBar(XRC().LoadMenuBar('MainMenubar'))
    self.binder.bindall(self)
    self.SetSize((400,320))

  @binder(wx.EVT_ACTIVATE)
  def OnActivate(self, event):
    print 'Activate!'

  @binder(wx.EVT_MENU, id=XRCID('wxID_EXIT'))
  def OnMenuQuit(self, event):
    self.Close()

  @binder(wx.EVT_MENU, id=XRCID('wxID_ABOUT'))
  def OnMenuAbout(self, event):
    wx.MessageBox(
      'The Sample Application ver 1.0',
      u'情報', wx.OK | wx.ICON_INFORMATION )

# startup application.
if __name__=='__main__':
  app = wx.App(False)
  wx_utils.XrcInit()
  frame = MainFrame()
  app.SetTopWindow(frame)
  frame.Show()
  app.MainLoop()

解説

メニューやツールバーをクリックしたとき、 wx.EVT_MENUというイベントが発生します。

ツールバーのボタンはwx.EVT_TOOLなんですが、 これはwx.EVT_MENUの別名で同じ意味です。

ですので、ツールバーボタンとメニュー項目に同じIDをつければ、 イベント割り当てはひとつで大丈夫です。

今回はwxSplitterWindowを使ってみました。 子コントロールを2つ持つことができる特殊コントロールです。

wxSplitterWindowのプロパティ

../../../_images/wxSplitterWindow.png

以下の3項目がこのコントロール特有のプロパティです。

orientation:
分割方向です。縦にすると左右に子コントロールをレイアウトします。
sashpos:
分割位置です。初期値指定のためです。
minsize:
分割領域の最小幅を指定できます。

このコントロールではユーザーが分割位置をドラッグして可変することができます。

端っこまで動かしきると二度と戻せなくなってしまいますが、 「minsize」を指定することで回避できます。