패널의 임의의 지점에 배치 된 이미지를 제거하려고합니다. 이 솔루션은 작동하지만 사용중인 색 구성표에 따라 다릅니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?wxPython에서 이미지를 제거하는 방법
import wx
from PIL import Image
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):
"""Create a panel class to contain screen widgets."""
def __init__(self, frame):
wx.Panel.__init__(self, frame)
self.Bind(wx.EVT_PAINT, self._on_paint)
cmd_refresh = wx.Button(self, wx.ID_REFRESH)
cmd_refresh.Bind(wx.EVT_BUTTON, self._on_cmd_refresh_click)
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.x_pos = random.randint(0, 100)
self.y_pos = random.randint(0, 100)
def _on_paint(self, event):
bitmap = self._get_image()
self._draw_image(bitmap)
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):
dc = wx.ClientDC(self)
dc.DrawBitmap(bitmap, self.x_pos, self.y_pos, True)
def _on_cmd_refresh_click(self, event):
del event
colour = (212, 212, 212)
blank_image = Image.new('RGB', (self.image_width, self.image_height), colour)
bitmap = wx.Bitmap.FromBuffer(self.image_width, self.image_height, blank_image.tobytes())
self._draw_image(bitmap)
if __name__ == '__main__':
screen_app = wx.App()
main_frame = MainFrame()
screen_app.MainLoop()
[편집 12월 29일 17 : wx.ClientDC에 wx.PaintDC 변경] 당신은 비트 맵을 다시 그릴없이 Panel
을 Refresh
필요
코드가 실패 : 그렇지 않으면 당신은 원본 사진 당신의 창을 때마다 크기를 조정할 다시 읽습니다 wxPaintDCImpl :: wxPaintDCImpl()에서 .. \ .. \ src \ msw \ dcclient.cpp (277)에서 C++ 어설 션 "어설 션 오류"가 실패했습니다 : wxPaintDCImpl이 (가) wxPaintDCImpl()에서 dc = wx.PaintDC – joaquin
나를 위해 일하는 파이썬 3.5.2, wxPython 4.0.0b2 gtk2 (phoenix) – Psionman
우분투 16.04. 나는 윈도우에서 테스트 할 것이다 – Psionman