wxpython在StaticBitmap上绘图

时间:2012-08-02 21:31:33

标签: python wxpython

嘿我想在用户点击图表上的一个点时在图像上绘制一个矩形。

要滚动浏览不同的图表,我正在使用staticBitmap。不幸的是,几乎所有关于DC的尝试都没有成功。 PaintDC和BufferedDC有时会导致无限循环,有时会将绘图放在图像后面。 ClientDC显示我绘制的框,但是当我调整大小时它会消失。使用MemoryDC创建绘图时,我只将图像保存到文件中,但未能放入staticBitmap。

我花了一周时间研究这个问题,阅读了很多不同的教程和论坛,试图找到同样的问题。我觉得没有其他人有这个问题。

每当调整窗口大小时,必须重新绘制最常用的ClientDC,从而导致闪烁。以下是我对ClientDC的看法:

    self.imageCtrl = wx.StaticBitmap(self.thePanel, wx.ID_ANY, 
                                     wx.EmptyBitmap(517,524))

def OnGoSelect(self,e):
    print "GO"
    img = wx.Image("./poster/"+self.picChoice,wx.BITMAP_TYPE_PNG) 
    self.imageCtrl.SetBitmap(wx.BitmapFromImage(img))

def DrawLine(self):
    dc = wx.ClientDC(self.imageCtrl)
    dc.SetPen(wx.Pen(wx.BLUE, 2))
    dc.DrawLines(((223, 376), (223, 39), (240, 39), (240,376), (223,376)))

当前的PaintDC不会进入无限循环,而是将图像放在staticBitmap中,并且图形以某种方式位于图像后面。因此,当我调整大小时,ComboBox会擦除部分图像并调整窗口大小以覆盖图像,从而擦除该部分。当我向后调整窗口大小时,绘图仍然存在,但图像被删除。这就是我所拥有的:

    self.imageCtrl = wx.StaticBitmap(self.thePanel, wx.ID_ANY, 
                                     wx.EmptyBitmap(517,524))

def OnGoSelect(self,e):
    print "GO"
    img = wx.Image("./poster/"+self.picChoice,wx.BITMAP_TYPE_PNG) 
    self.imageCtrl.SetBitmap(wx.BitmapFromImage(img))

    self.imageCtrl.Bind(wx.EVT_PAINT, self.OnPaint)

def OnPaint(self, e):
    print "OnPaint Triggered"
    dc = wx.PaintDC(self.imageCtrl)
    dc.Clear()
    dc.SetPen(wx.RED_PEN)
    dc.DrawLines(((100, 200), (100, 100), (200, 100), (200,200), (100,200))) 

对于MemoryDC,我自己加载一个EmptyBitmap,绘制它,然后尝试将它放入staticBitmap。它给了我一个空白的灰色屏幕。如果我没有在EmptyBitmap上绘图,它就会显示正常,黑色。即使我画了它,我也将它保存到一个文件中,该文件应该按照它应该的方式出现,但仍然在应用程序中给了我灰色屏幕。这是MemoryDC代码:

    self.imageCtrl = wx.StaticBitmap(self.thePanel, wx.ID_ANY, 
                                     wx.EmptyBitmap(517,524))

def Draw(self, e):
    print "Draw" 
    img = wx.Image("./poster/Test2.png", wx.BITMAP_TYPE_ANY)
    bit = wx.EmptyBitmap(517,524)
    dc = wx.MemoryDC(bit)
    dc.SetBackground(wx.Brush(wx.BLACK))
    dc.Clear()
    dc.SetPen(wx.Pen(wx.RED, 1))
    dc.DrawLines(((83, 375), (83, 42), (120, 42), (120,375), (83,375)))
    self.imageCtrl.SetBitmap(bit)  
    bit.SaveFile("bit.bmp", wx.BITMAP_TYPE_BMP)

我的智慧结束了。欢迎任何建议!

1 个答案:

答案 0 :(得分:4)

我找到了它!

之前我不知道使用MemoryDC时,我必须取消选择我正在绘制的位图。这是通过将wx.NullBitmap传递给SelectObject方法来完成的。

这是MemoryDC的代码:

def Draw(self, e):
    print "Draw" 
    img = wx.Image("./poster/Test2.png", wx.BITMAP_TYPE_ANY)
    bit = wx.EmptyBitmap(517,524)
    imgBit = wx.BitmapFromImage(img)
    dc = wx.MemoryDC(imgBit)
    dc.SetPen(wx.Pen(wx.RED, 1))
    dc.DrawLines(((83, 375), (83, 42), (120, 42), (120,375), (83,375)))
    dc.SelectObject(wx.NullBitmap)# I didn't know I had to deselect the DC
    self.imageCtrl.SetBitmap(imgBit)  
    imgBit.SaveFile("bit.bmp", wx.BITMAP_TYPE_BMP)