#@@@ すっかりwxpythonによる描画を忘れてしまったので再考
#やはり短いコードをアップして置かないと忘れてしまう。
#参考サイト
#まくまくpythonノート
#https://maku77.github.io/python/wxpython/graphics.html
#InitBufferをとおして描画すると
#GetSize() doesn't work without windowとなるためコメントアウト
#OnSize内で描画コードへ飛ばす
import wx
class MyFrame(wx.Frame):
def __init__(self):
#self.size = (250, 200)
wx.Frame.__init__(self, None, -1, "Title", size=(250, 200))
#InitBufferをとおして描画すると
#GetSize() doesn't work without windowとなるためコメントアウト
#OnSize内で描画コードへ飛ばす
#self.InitBuffer() #初期化
#イベント
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Show()
#EVT_PAINT イベントのハンドラの中で描画処理をバッファリングしたい場合
#は、wx.BufferedDC の代わりに wx.BufferedPaintDC を使用します。
def OnPaint(self, evt):
print "OnPaint"
dc = wx.BufferedPaintDC(self, self.buffer)
"""ウインドウサイズが変更された時に呼ばれる処理"""
def OnSize(self, evt):
print "OnSize"
#self.InitBuffer()
size = self.GetClientSize()
self.buffer = wx.EmptyBitmap(*size)
self.DrawToBuffer()
"""初期化"""
def InitBuffer(self):
print "InitBuffer"
# クライアントのウインドウサイズを取得
#ClientSize :クライアントサイズは、ウィジェットに属する
#任意の罫線の内側のウィジェットの領域を表し、EVT_PAINTイ
#ベントで描画可能な領域です。 ウィジェットに境界線がない
#場合、クライアントのサイズはそのサイズと同じです
#ここでこのコードを使うとまだウィンドウがないのでエラーとなる
size = self.GetClientSize()
#w, h = self.size
# ウインドウサイズで、空の描画用バッファ(bitmap)を作成
#ポインタとかおもった。可変長変数。
#タプルを関数に渡すときに * を付けると、タプルの各要素を
#関数の引数として展開されて渡される
self.buffer = wx.EmptyBitmap(*size)
dc = wx.BufferedDC(None, self.buffer)
dc.SetBackground(wx.Brush('white'))
# デバイスコンテキストでクリア、これがないと画面が真っ暗になる
#dc.Clear()
#self.Draw(dc) # 実際の描画処理
# Falseを指定して背景を消さなくしたら画面のちらつきが出なくなった
# #self.Refresh(eraseBackground=False)
self.DrawToBuffer()
#描画
#wx.BufferedDC は、あるデバイス・コンテキストへの描画処 理をバッファ
#リングし、一度に描画内容を反映するようにしま す。 例えば、
#wx.ClientDC への連続した描画を wx.BufferedDC でバッファリングすれ
#ば、画面上での描画のち らつきを防ぐことができます。
def DrawToBuffer(self):
print "DrawToBuffer"
dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
dc.SetBackground(wx.Brush('white'))
#Clear 現在の背景ブラシを使用してデバイスコンテキストを
#クリアします
#これを実行しないと背景が真っ黒になる
dc.Clear()
#描画
dc.DrawText('Hoge hoge', 10, 10)
dc.DrawLine(10, 10, 200, 10)
dw, dh = dc.GetSize()
dc.SetPen(wx.Pen('blue', 3))
dc.DrawCircle(dw/2, dh/2, 50)
self.Refresh(False)
if __name__ == '__main__':
app = wx.App()
MyFrame()
#MyFrame(None, -1, "Test ", size=(800, 600))
app.MainLoop(ze() doesn't work without window)
~
~
~
0 件のコメント:
コメントを投稿