2

wxPythonを使用してプロジェクトのカットオプティマイザーを構築しています。描画領域に単純なフレームをレイアウトし、その下にアクションとメッセージ用の小さなパネルをレイアウトしたいと思います。

私はこれをやっています:

topPanel = wx.Panel(self)
# the intended drawing area, 800x600    
self.planeArea = wx.Window(topPanel, -1, pos=(0, 0), size=(800, 600))

# a panel for showing messages and placing some buttons    
commandArea = wx.Panel(topPanel, -1, pos=(800, 0), size=(800, 200))
button = wx.Button(commandArea, -1, label='Optimize')

box = wx.BoxSizer(wx.VERTICAL)        
box.Add(self.planeArea, 0, wx.EXPAND | wx.ALL)
box.Add(commandArea, 0, wx.EXPAND | wx.ALL)
topPanel.SetSizer(box)

そして、私の描画方法では、次のことを行います。

# I'm using clientDC because I draw the shapes after the user chooses a file, Am I doing it wrong? I still haven't figured how or when to use paintDC and left that research for later
dc = wx.ClientDC(self.planeArea)
dc.Clear()
dc.SetDeviceOrigin(0, 0)

for polygon in plane.polygons:
    dc.DrawPolygon(polygon.vertices)

SetDeviceOriginを使用しない場合、ポリゴンはウィンドウの左端と最上部のポイントから描画されますが、左端の最下部のポイントから開始したいと思います。

問題は、0,0がウィンドウ全体に相対的であり、描画パネルに相対的ではないため、図面が誤って配置されていることです。

私はドキュメントと次の例を読んでいますが、これを整理することはできません。誰かが私が間違っていることを知っていますか?

MountainLionとPython2.7(PyDevとEclipse)でwxPython2.9-osx-cocoa-py2.7を使用しています

どうもありがとう、

ロッド

4

2 に答える 2

0

何が悪いのかわかりませんが、同じ問題があります。

wx.ClientDC(event.GetEventObject())を使用してメソッドを外部に配置すると、osx(10.6.8 python 2.7 wxpython 2.9.4.0 cocoa)で正常に機能することがわかりました。

これは比較的機能します(フレームとパネルを描画し、次にパネルに対してボックスを描画します)。

import wx

class test(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(test, self).__init__(*args, **kwargs)
        self.InitUI()
    def InitUI(self):
        panel = wx.Panel(self, -1)
        graphpanel = wx.Panel(panel, -1, pos=(50, 50), size=(200, 200))
        graphpanel.Bind(wx.EVT_PAINT, PaintGraph)
        self.SetSize ((1000,750))
        self.Centre()
        self.Show(True)

def PaintGraph(event):
    graph = wx.ClientDC(event.GetEventObject())
    graph.SetPen(wx.Pen(wx.BLUE, 1, wx.SOLID))
    graph.DrawRectangle(0, 0, 100, 100)

def main():
    ex = wx.App()
    test(None)
    ex.MainLoop()

if __name__ == '__main__':
    main()

これはWindowsでは比較的機能しますが、osxでは機能しません(私のOSX 10.6.8ではフレームに描画されます):

import wx

class test(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(test, self).__init__(*args, **kwargs)
        self.InitUI()
    def InitUI(self):
        panel = wx.Panel(self, -1)
        graphpanel = wx.Panel(panel, -1, pos=(50, 50), size=(200, 200))
        graphpanel.Bind(wx.EVT_PAINT, self.PaintGraph)
        self.SetSize ((1000,750))
        self.Centre()
        self.Show(True)    
    def PaintGraph(self, event):
        graph = wx.ClientDC(self)
        graph.SetPen(wx.Pen(wx.BLUE, 1, wx.SOLID))
        graph.DrawRectangle(0, 0, 100, 100)

def main():
    ex = wx.App()
    test(None)
    ex.MainLoop()

if __name__ == '__main__':
    main()

誰もが理由を知っていますか?

于 2013-02-12T22:20:12.510 に答える
0

通常は原点などはそのままにして描画を調整しますが、 のようなものが欲しいと思いますdc.SetDeviceOrigin(0, dc.GetSize().height-1)。つまり、デフォルトの座標空間の点 (0,高さ-1) が新しい (0,0) になります。ただし、そのポイントより上の座標は依然として負であり、それより下では正です。それを切り替えるには、 を呼び出す必要がありますSetAxisOrientation

于 2013-02-04T20:13:02.060 に答える