Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxpython在静态位图上绘制_Python_Wxpython - Fatal编程技术网

wxpython在静态位图上绘制

wxpython在静态位图上绘制,python,wxpython,Python,Wxpython,嘿,当用户单击图形上的某个点时,我正试图在图像顶部绘制一个矩形 为了滚动不同的图形,我使用了静态位图。不幸的是,几乎每一次使用DCs的尝试都没有成功。PaintDC和BufferedDC有时都会导致出现无限循环,而其他时候则会将图形置于图像后面。ClientDC显示了我绘制的框,但当我调整大小时它消失了。当我只将图像保存到文件中时,使用MemoryDC创建图形是有效的,但无法将其放入静态位图中 我花了大约一周的时间研究这个问题,阅读了很多不同的教程和论坛,试图找到同样的问题。我觉得没有其他人有这

嘿,当用户单击图形上的某个点时,我正试图在图像顶部绘制一个矩形

为了滚动不同的图形,我使用了静态位图。不幸的是,几乎每一次使用DCs的尝试都没有成功。PaintDC和BufferedDC有时都会导致出现无限循环,而其他时候则会将图形置于图像后面。ClientDC显示了我绘制的框,但当我调整大小时它消失了。当我只将图像保存到文件中时,使用MemoryDC创建图形是有效的,但无法将其放入静态位图中

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

最有效的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不会进入无限循环,而是将图像放置在静态位图中,并且不知何故,图形位于图像后面。因此,当我调整大小时,组合框会删除图像的一部分,调整窗口大小以覆盖图像时,会删除该部分。当我重新调整窗口的大小时,图形仍在那里,但图像已被擦除。以下是我所拥有的:

    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,在上面绘制,然后尝试将其放入静态位图。它给了我一个空白的灰色屏幕。如果我没有在空白地图上画画,结果是正常的,黑色的。甚至当我在上面画的时候,我把它保存到了一个文件中,这个文件本来应该是这样的,但在应用程序中仍然给了我一个灰色的屏幕。以下是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)
我束手无策。欢迎任何意见

我找到了

之前我不知道在使用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)