分割ウインドウな例
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>ファイル(&F)</label>
<object class="wxMenuItem" name="wxID_EXIT">
<label>終了(&X)</label>
<accel>Alt+F4</accel>
</object>
</object>
<object class="wxMenu">
<label>ヘルプ(&H)</label>
<object class="wxMenuItem" name="wxID_ABOUT">
<label>情報(&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のプロパティ
以下の3項目がこのコントロール特有のプロパティです。
- orientation:
- 分割方向です。縦にすると左右に子コントロールをレイアウトします。
- sashpos:
- 分割位置です。初期値指定のためです。
- minsize:
- 分割領域の最小幅を指定できます。
このコントロールではユーザーが分割位置をドラッグして可変することができます。
端っこまで動かしきると二度と戻せなくなってしまいますが、 「minsize」を指定することで回避できます。