2010-02-24 5 views
6

화면 영역을 선택해야하는 응용 프로그램을 코딩하고 있습니다. 커서를 십자 기호로 변경 한 다음 사용자 선택 영역에 직사각형을 그려야합니다. 먼저 커서를 조작하는 방법을 찾고 wxPython을 발견했습니다. wxPython을 사용하면 Panel을 사용하여 프레임에서 쉽게이 작업을 수행 할 수 있습니다. 즉, 원하는 영역을 선택하는 동안 사용자가 자신의 화면을 볼 수 있도록 투명하게 창이 필요합니다. 그러나 프레임과 패널을 만들면 투명하게 된 모든 것은 버그가 있습니다.파이썬 그림 그리기

wxPython을 사용하든 사용하지 않든 모든 솔루션에 대해 열려 있습니다. 실제로 사용하고 있는지 잘 모르기 때문에 사용하지 마십시오.

저는 파이썬을 처음 사용하고 영어 원어민이 아니기 때문에, 이해할 수 없다면 유감입니다.

이 내가, 그 대부분 wxDC 페인트 명령에 사용되는 당신은 윈도우 생성에 wx.TRANSPARENT를 사용해서는 안

import wx 

class SelectableFrame(wx.Frame): 

    c1 = None 
    c2 = None 

    def __init__(self, parent=None, id=-1, title=""): 
     wx.Frame.__init__(self, parent, id, title, size=wx.DisplaySize(), style=wx.TRANSPARENT_WINDOW) 

     self.panel = wx.Panel(self, size=self.GetSize(), style=wx.TRANSPARENT_WINDOW) 

     self.panel.Bind(wx.EVT_MOTION, self.OnMouseMove) 
     self.panel.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown) 
     self.panel.Bind(wx.EVT_LEFT_UP, self.OnMouseUp) 
     self.panel.Bind(wx.EVT_PAINT, self.OnPaint) 

     self.SetCursor(wx.StockCursor(wx.CURSOR_CROSS)) 

    def OnMouseMove(self, event): 
     if event.Dragging() and event.LeftIsDown(): 
      self.c2 = event.GetPosition() 
      self.Refresh() 

    def OnMouseDown(self, event): 
     self.c1 = event.GetPosition() 

    def OnMouseUp(self, event): 
     self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) 

    def OnPaint(self, event): 
     if self.c1 is None or self.c2 is None: return 

     dc = wx.PaintDC(self.panel) 
     dc.SetPen(wx.Pen('red', 1)) 
     dc.SetBrush(wx.Brush(wx.Color(0, 0, 0), wx.TRANSPARENT)) 

     dc.DrawRectangle(self.c1.x, self.c1.y, self.c2.x - self.c1.x, self.c2.y - self.c1.y) 

    def PrintPosition(self, pos): 
     return str(pos.x) + " " + str(pos.y) 


class MyApp(wx.App): 

    def OnInit(self): 
     frame = SelectableFrame() 
     frame.Show(True) 
     self.SetTopWindow(frame) 

     return True 



app = MyApp(0) 
app.MainLoop() 

답변

5

코딩 것입니다. 윈도우를 투명하게 만들려면 win.SetTransparent (amount)를 호출합니다. 여기서 amount는 0-255, 255는 불투명, 0은 완전히 투명합니다. http://www.wxpython.org/docs/api/wx.Window-class.html#SetTransparent

고객님의 플랫폼이 투명한 윈도우를 지원하는 경우에만 코드가 수정되었으며 CanSetTransparent로 확인할 수 있습니다. 나는 Windows XP에서 그것을 테스트했다.

import wx 

class SelectableFrame(wx.Frame): 

    c1 = None 
    c2 = None 

    def __init__(self, parent=None, id=-1, title=""): 
     wx.Frame.__init__(self, parent, id, title, size=wx.DisplaySize()) 

     self.panel = wx.Panel(self, size=self.GetSize()) 

     self.panel.Bind(wx.EVT_MOTION, self.OnMouseMove) 
     self.panel.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown) 
     self.panel.Bind(wx.EVT_LEFT_UP, self.OnMouseUp) 
     self.panel.Bind(wx.EVT_PAINT, self.OnPaint) 

     self.SetCursor(wx.StockCursor(wx.CURSOR_CROSS)) 

     self.SetTransparent(50) 

    def OnMouseMove(self, event): 
     if event.Dragging() and event.LeftIsDown(): 
      self.c2 = event.GetPosition() 
      self.Refresh() 

    def OnMouseDown(self, event): 
     self.c1 = event.GetPosition() 

    def OnMouseUp(self, event): 
     self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) 

    def OnPaint(self, event): 
     if self.c1 is None or self.c2 is None: return 

     dc = wx.PaintDC(self.panel) 
     dc.SetPen(wx.Pen('red', 1)) 
     dc.SetBrush(wx.Brush(wx.Color(0, 0, 0), wx.TRANSPARENT)) 

     dc.DrawRectangle(self.c1.x, self.c1.y, self.c2.x - self.c1.x, self.c2.y - self.c1.y) 

    def PrintPosition(self, pos): 
     return str(pos.x) + " " + str(pos.y) 


class MyApp(wx.App): 

    def OnInit(self): 
     frame = SelectableFrame() 
     frame.Show(True) 
     self.SetTopWindow(frame) 

     return True 


app = MyApp(0) 
app.MainLoop() 
+0

고마워, 버그가있는 문제가 해결되었지만 지금은 또 다른 문제가 있습니다! 선택 사각형도 투명 해져서 창을 완전히 투명하게 만들지 못하고 선택 영역을 볼 수 없습니다. 하지만 지금은 괜찮습니다. – Franco