gpt4 book ai didi

python - wxpython 在静态位图上绘图

转载 作者:太空狗 更新时间:2023-10-30 02:48:45 25 4
gpt4 key购买 nike

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

为了滚动浏览不同的图表,我使用了 staticBitmap。不幸的是,几乎所有对 DC 的尝试都没有成功。 PaintDC 和 BufferedDC 有时会导致无限循环发生,有时会将绘图放在图像后面。 ClientDC 显示了我绘制的框,但是当我调整大小时它消失了。当我只将图像保存到文件但未能放置在 staticBitmap 中时,使用 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 不会进入无限循环,而是将图像放置在 staticBitmap 中,并且绘图以某种方式位于图像后面。因此,当我调整大小时,ComboBoxes 会删除部分图像并调整窗口大小以覆盖图像,并删除该部分。当我调整窗口大小时,绘图仍然存在,但图像已被删除。这是我的:

    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)

我已经无计可施了。欢迎任何建议!

最佳答案

我找到了!

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

关于python - wxpython 在静态位图上绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11786103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com