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()
~
~
~
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿