3262292 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

傀儡師の館.Python

傀儡師の館.Python

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

Recent Posts

Calendar

Keyword Search

▼キーワード検索

Category

Archives

2023.11
2023.10
2023.09
2023.08
2023.07

Freepage List

Profile

kugutsushi

kugutsushi

Free Space

設定されていません。
2010.09.30
XML
カテゴリ:Python
wxPython 入門 (1) に引き続き、wPython.org の Getting Started をサカナに第二弾。"Building a simple text editor" のあたりを見ていく。シンプルなテキストエディタを作ってみましょうというところ。


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

import wx
class MyFrame(wx.Frame):
""" Frame をベースに新しいクラスを作る """
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(200,100))
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
self.Show(True)

app = wx.App(False)
frame = MyFrame(None, 'Small editor')
app.MainLoop()


これを実行すると、テキスト入力ができるウィンドウが一つ表示される。一応、エディタというだけあって、Ctrl-X と Ctrl-V でカットアンドペーストなども対応している。

wx.Frame を継承して、新しいクラス MyFrame を作った。まずは、フレームオブジェクトの初期化メソッド wx.Frame.__init__ だけを上書きして書き換えちゃう。wx.Frame.__init__(self, parent, title=title, size=(200,100)) と、親オブジェクト、タイトル、サイズをしていしてフレーム(ウィンドウ)を作っている。サイズの指定は、size=(横、縦)。

ためしに、タイトルやサイズを変えて表示してみたりする。タイトルに日本語を入れたらどうなるか。

class MyFrame(wx.Frame):
""" Frame をベースに新しいクラスを作る """
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(400,300))
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
self.Show(True)

app = wx.App(False)
frame = MyFrame(None, '簡易エディタ')
app.MainLoop()


特に問題ないようだ。

self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE) をもう少し見てみよう。

wx.Frame の中で、テキストコントロールを作ってやっているのだが、style=wx.TE_MULTILINE を外してしまうとどうなるか。そうすると、改行ができない一行だけのテキスト入力になる。ウィンドウサイズより長い文字列を入力することはできるが、自動的に折り返し表示をしてくれるわけでもなく、また、スクロールバーが自動的に出てくるわけでもなく、表示できる範囲だけ表示される。つまり、style で必要に応じて、テキストコントロールに対して適切な属性を設定してあげないといけないということ。TextCtrl は最低限、親ウィンドウを指定する必要があるが、ここでは self なので、MyFrame のフレームが親ということ。

それでは、他にどんな属性が設定できるのだろうか。というのは後で見ることにして、前回は frame.Show() と、クラスの定義外で実行してフレームを表示していたのだが、今回は、クラスの定義の中で self.Show(True) としている。そうすると、メインのところがすこしすっきりする。

さて、Show() メソッドで明示的に True を渡しているところも前回と違うところ。実際には、何も渡さなければ True がデフォルトなので動きとしては変わらない。代わりに、False を入れると、ウィンドウが表示されなくなる。ちょっと表示の状態をいじってみる。

class MyFrame(wx.Frame):
""" Frame をベースに新しいクラスを作る """
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(400,300))
self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
print "step 2+"
time.sleep(2)
self.Show(False) # ここでは False に変更してみる。
print "step 2++"
time.sleep(2)

print "step 1"
app = wx.App(False)
print "step 2"
frame = MyFrame(None, '簡易エディタ')
print "step 3"
time.sleep(2)
frame.Show(True) # ここで True にした。
print "step 4"
time.sleep(2)
app.MainLoop()


__init__ メソッド内の self.Show(True) にしたり、self.Show(False) したり試してみる Show(True) で初めてウィンドウが表示されていないのが確認できるかな。また、Show(True), Show(False), Show(True) を繰り返せば表示したり隠したりすることができる。

さて、いよいよテキストコントロールでどういう属性/スタイルを設定できるか見てみる。ちょっと力技。

import wx
for name in dir(wx):
   if name.startswith("TE_"):
      print name
を実行してみる。

TE_AUTO_SCROLL
TE_AUTO_URL
TE_BESTWRAP
TE_CAPITALIZE
TE_CENTER
TE_CENTRE
TE_CHARWRAP
TE_DONTWRAP
TE_HT_BEFORE
TE_HT_BELOW
TE_HT_BEYOND
TE_HT_ON_TEXT
TE_HT_UNKNOWN
TE_LEFT
TE_LINEWRAP
TE_MULTILINE
TE_NOHIDESEL
TE_NO_VSCROLL
TE_PASSWORD
TE_PROCESS_ENTER
TE_PROCESS_TAB
TE_READONLY
TE_RICH
TE_RICH2
TE_RIGHT
TE_WORDWRAP


ということで、いろいろある。

スクロールやワードラップ、右寄せ、左寄せ、センタリング等々の設定ができる。試しに TE_AUTO_URL も追加して、 self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE|wx.TE_CENTER|wx.TE_AUTO_URL) としてみると、ちゃんと URL が認識され、センタリングされた。デフォルトで、スクロールバーは必要に応じて出てくるので、TE_NO_VSCROLL も追加したり、パスワード用に TE_PASSWORD も追加したりいろいろやってみるとよいか。TE_PASSWORD を指定すると、全部の文字が * で表示されるようになる。

TE_AUTO_URL は、URLを認識してくれるけれど、そこにマウスを持っていったときにwxTextUrlEvents を拾って、さらに処理を書いてあげないとクリックしても何にもならない。サポートもWin32環境下だけ。色やフォントを使ったリッチテキスト (TE_RICH も TE_RICH2) も Win32 依存。Unix とかだとリッチテキストじゃなくても、色やフォントを使えるが、Windows の場合は、リッチテキストにする必要がありそう。Windows と Linux の両方で動くようにしたいとき、このあたり注意が必要なのかな。

class MyFrame(wx.Frame):
""" Frame をベースに新しいクラスを作る """
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(400,300))
self.control = wx.TextCtrl(self,
style=wx.TE_MULTILINE|wx.TE_RIGHT|TE_AUTO_URL|wx.TE_RICH)
self.Show(True)
print self.control.GetDefaultStyle()


TextCtrl の日本語の説明があった。すばらしい。wxTextCtrl。でも、アルファベット順クラスリファレンス を見ると、翻訳済みのものは、限られていようだけど。

さて、フォントを設定したり、背景色や文字色を変えたりするにはどうしたらよいのかなども含めて、次回、もう少し詳しく、TextCtrl を見ていこうかと思う。亀のような歩みだなぁw


Python 3プログラミング徹底入門

Python 3プログラミング徹底入門

価格:5,040円(税込、送料別)



エキスパートPythonプログラミング

エキスパートPythonプログラミング

価格:3,780円(税込、送料別)





無料アクセス解析






お気に入りの記事を「いいね!」で応援しよう

Last updated  2015.03.08 17:03:31
コメント(0) | コメントを書く



© Rakuten Group, Inc.