如何使用 DC.Clear() 在 wxPython 中删除图像
How to remove image in wxPython using DC.Clear()
我正在尝试删除放置在面板上某个随机点的图像。我之前曾试图找到解决此问题的方法 here,但没有人能够提供帮助。
我使用 wx.DC 取得了一些进展。但是,Clear 方法的 DC class 文档说:
Clear Clears the device context using the current background brush.
我在下面的程序中尝试过,但是清除区域的颜色与面板背景颜色不太一样。谁能建议如何将画笔颜色设置为面板背景颜色?
import wx
import random
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "Remove image")
panel = MainPanel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(panel)
self.SetSizerAndFit(sizer)
self.Centre()
self.Show()
class MainPanel(wx.Panel):
def __init__(self, frame):
wx.Panel.__init__(self, frame)
self.Bind(wx.EVT_PAINT, self._on_paint)
self.frame = frame
# Button
cmd_refresh = wx.Button(self, wx.ID_REFRESH)
cmd_refresh.Bind(wx.EVT_BUTTON, self._on_cmd_refresh_click)
# Main sizer
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add((500, 300))
sizer.Add(cmd_refresh, flag=wx.ALL|wx.ALIGN_CENTER, border=10)
self.SetSizer(sizer)
self.started = False
def _on_paint(self, event):
del event
if not self.started:
bitmap = self._get_image()
self._draw_image(bitmap)
self._draw_image(bitmap)
self.started = True
def _get_image(self):
bitmap = wx.Bitmap()
bitmap.LoadFile("red.png", wx.BITMAP_TYPE_ANY)
self.image_width = bitmap.GetWidth()
self.image_height = bitmap.GetHeight()
return bitmap
def _draw_image(self, bitmap):
self.x_pos = random.randint(0, self.frame.GetSize()[0]-self.image_width)
self.y_pos = random.randint(0, self.frame.GetSize()[1]-self.image_height)
dc = wx.PaintDC(self)
dc.DrawBitmap(bitmap, self.x_pos, self.y_pos, True)
def _on_cmd_refresh_click(self, event):
del event
dc = wx.ClientDC(self)
points = (self.x_pos, self.y_pos, self.image_width, self.image_height)
dc.DestroyClippingRegion()
dc.SetClippingRegion(points)
dc.Clear()
if __name__ == '__main__':
screen_app = wx.App()
main_frame = MainFrame()
screen_app.MainLoop()
我有一个解决方法
我已经放了两条线
dc = wx.ClientDC(self)
panel.SetBackgroundColour(dc.GetBackground().Colour)
在 MainFrame 的 init 方法中 class。它有效但并不令人满意,因为面板颜色不再由主题定义(在我的例子中是 (225, 225, 225) 而不是 (212, 212, 212))。
这可能看起来并不重要,但是
- 有损使用主题的应用程序的统一性,显得很凌乱;
- 所选颜色不在我的控制范围内。我想知道这种任意颜色是从哪里来的?
- 原版在 Windows 但在 Ubuntu 下完美运行。所以这意味着有 OS 依赖代码。
我正在尝试删除放置在面板上某个随机点的图像。我之前曾试图找到解决此问题的方法 here,但没有人能够提供帮助。
我使用 wx.DC 取得了一些进展。但是,Clear 方法的 DC class 文档说:
Clear Clears the device context using the current background brush.
我在下面的程序中尝试过,但是清除区域的颜色与面板背景颜色不太一样。谁能建议如何将画笔颜色设置为面板背景颜色?
import wx
import random
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "Remove image")
panel = MainPanel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(panel)
self.SetSizerAndFit(sizer)
self.Centre()
self.Show()
class MainPanel(wx.Panel):
def __init__(self, frame):
wx.Panel.__init__(self, frame)
self.Bind(wx.EVT_PAINT, self._on_paint)
self.frame = frame
# Button
cmd_refresh = wx.Button(self, wx.ID_REFRESH)
cmd_refresh.Bind(wx.EVT_BUTTON, self._on_cmd_refresh_click)
# Main sizer
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add((500, 300))
sizer.Add(cmd_refresh, flag=wx.ALL|wx.ALIGN_CENTER, border=10)
self.SetSizer(sizer)
self.started = False
def _on_paint(self, event):
del event
if not self.started:
bitmap = self._get_image()
self._draw_image(bitmap)
self._draw_image(bitmap)
self.started = True
def _get_image(self):
bitmap = wx.Bitmap()
bitmap.LoadFile("red.png", wx.BITMAP_TYPE_ANY)
self.image_width = bitmap.GetWidth()
self.image_height = bitmap.GetHeight()
return bitmap
def _draw_image(self, bitmap):
self.x_pos = random.randint(0, self.frame.GetSize()[0]-self.image_width)
self.y_pos = random.randint(0, self.frame.GetSize()[1]-self.image_height)
dc = wx.PaintDC(self)
dc.DrawBitmap(bitmap, self.x_pos, self.y_pos, True)
def _on_cmd_refresh_click(self, event):
del event
dc = wx.ClientDC(self)
points = (self.x_pos, self.y_pos, self.image_width, self.image_height)
dc.DestroyClippingRegion()
dc.SetClippingRegion(points)
dc.Clear()
if __name__ == '__main__':
screen_app = wx.App()
main_frame = MainFrame()
screen_app.MainLoop()
我有一个解决方法
我已经放了两条线
dc = wx.ClientDC(self)
panel.SetBackgroundColour(dc.GetBackground().Colour)
在 MainFrame 的 init 方法中 class。它有效但并不令人满意,因为面板颜色不再由主题定义(在我的例子中是 (225, 225, 225) 而不是 (212, 212, 212))。
这可能看起来并不重要,但是
- 有损使用主题的应用程序的统一性,显得很凌乱;
- 所选颜色不在我的控制范围内。我想知道这种任意颜色是从哪里来的?
- 原版在 Windows 但在 Ubuntu 下完美运行。所以这意味着有 OS 依赖代码。