2017-11-26 10 views
0

패널의 임의의 지점에 배치 된 이미지를 제거하려고합니다. 이전에이 here에 대한 해결책을 찾으려고했지만 아무도 도와 드릴 수 없었습니다.DC.Clear()를 사용하여 wxPython에서 이미지를 제거하는 방법

나는 wx.DC를 사용하여 몇 가지 진전을 이루었습니다. 그러나, 명확한 방법에 대한 DC 클래스의 문서는 말한다 : 나는 그러나 클리어 영역은 패널 배경 색상으로 매우 동일한 색상이 아닌, 다음과 같은 프로그램이 시도

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() 

답변

0

은 내가 메인 프레임 클래스의 초기화 방법으로 두 줄

dc = wx.ClientDC(self) 
    panel.SetBackgroundColour(dc.GetBackground().Colour) 

을 배치 한 작업 주위에이

에 있습니다. 그것은 작동하지만 패널 색상이 (212, 212, 212) 대신 내 경우 (225, 225, 225) 테마에 의해 정의 된 것이 아니기 때문에 만족스럽지 않습니다. 이것은 중요한 것 같지 수

하지만

  1. 이 테마를 사용하는 응용 프로그램의 통일성에서 detracts하고 매우 어수선한 것 같습니다;
  2. 선택한 색상이 제 통제 밖에 있습니다. 이 임의의 색상이 어디에서 유래했는지 궁금합니다.
  3. 원본은 Windows에서는 완벽하게 작동하지만 Ubuntu에서는 완벽하게 작동하지 않습니다. 따라서 OS 의존 코드가 있어야합니다.