2020年2月28日金曜日

wxpython dc描画の雛形








#@@@ すっかり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 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts