2020年2月29日土曜日

wxpython wx.EVT_SIZE, self.OnSize によって描画位置を同じにする



https://hannsihannsyou.blogspot.com/2020/02/wxpython.html
上前回のコードはおかしかった。

以下のようにするとウィンドウサイズ変更しても、ウィンドウにたいして相対的に同じ位置
に描画されたものが、描画される。


wxpython/お絵かき5/draw_dc_hinagata.py


# coding: UTF-8
#@@@ すっかりwxpythonによる描画を忘れてしまったので再考
#やはり短いコードをアップして置かないと忘れてしまう。

#参考サイト
#まくまくpythonノート
# https://maku77.github.io/python/wxpython/graphics.html

#元コードでは  GetSize() doesn't work without window
#のエラーがでる
#初期化InitBufferで buffer,dcを作成しそれを
#DrawToBufferにdcをつけて実行させると解消された。

import wx

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Title", size=(250, 200))
        self.InitBuffer() #初期化

        #イベント
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_SIZE, self.OnSize)
        self.Show()

    """初期化"""
    def InitBuffer(self):
        print "InitBuffer"
        # クライアントのウインドウサイズを取得
        #ClientSize :クライアントサイズは、ウィジェットに属する
        #任意の罫線の内側のウィジェットの領域を表し、EVT_PAINTイ
        #ベントで描画可能な領域です。 ウィジェットに境界線がない
        #場合、クライアントのサイズはそのサイズと同じです
        size = self.GetClientSize()


        # ウインドウサイズで、空の描画用バッファ(bitmap)を作成
        #ポインタとかおもった。可変長変数。
        #タプルを関数に渡すときに * を付けると、タプルの各要素を
        #関数の引数として展開されて渡される
        self.buffer = wx.EmptyBitmap(*size)
        dc = wx.BufferedDC(None, self.buffer)
        dc.SetBackground(wx.Brush('white'))
        # デバイスコンテキストでクリア、これがないと画面が真っ暗になる
        dc.Clear()
        # Falseを指定して背景を消さなくしたら画面のちらつきが出なくなった
        #self.Refresh(eraseBackground=False)
        self.DrawToBuffer(dc)

    #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()

    #描画
    #wx.BufferedDC は、あるデバイス・コンテキストへの描画処 理をバッファ
    #リングし、一度に描画内容を反映するようにしま す。 例えば、
    #wx.ClientDC への連続した描画を wx.BufferedDC でバッファリングすれ
    #ば、画面上での描画のち らつきを防ぐことができます。
    def DrawToBuffer(self, dc):
        print "DrawToBuffer"
        #描画
        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()
    app.MainLoop()

~                                                                                 
~                                                                                 
~                                             

0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts