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 是相对于整个窗口,而不是相对于我的绘图面板。

我一直在阅读文档和以下示例,但我无法解决这个问题。有谁知道我做错了什么?

我在 Mountain Lion 和 Python 2.7(PyDev 和 Eclipse)中使用 wxPython2.9-osx-cocoa-py2.7

非常感谢,

4

2 回答 2

0

我通常不理会原点等,而是调整绘图,但我认为您想要类似的东西dc.SetDeviceOrigin(0, dc.GetSize().height-1),这意味着默认坐标空间中的点 (0,height-1) 将成为新的 (0,0)。但是,该点上方的坐标仍然是负数,低于该点的坐标仍然是正数。要切换它,您需要调用SetAxisOrientation.

于 2013-02-04T20:13:02.060 回答
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 回答