2010-02-24 76 views
6

Tôi đang mã hóa ứng dụng cần chọn một khu vực của màn hình. Tôi cần phải thay đổi con trỏ đến một hình chữ thập và sau đó vẽ một hình chữ nhật trên lựa chọn người dùng. Điều đầu tiên tôi tìm kiếm là làm thế nào để thao tác con trỏ và tôi gặp wxPython. Với wxPython tôi có thể dễ dàng thực hiện điều này trên Frame với một Panel, điều tôi cần là cửa sổ trong suốt để người dùng có thể nhìn thấy màn hình của mình trong khi đang chọn vùng mong muốn, nhưng nếu tôi tạo Frame và Panel đối tượng trong suốt mọi thứ bị lỗi.Vẽ Python trên màn hình

Vì vậy, tôi mở cho bất kỳ giải pháp nào, hoặc sử dụng wxPython hoặc không sử dụng nó bởi vì tôi thực sự không biết mình có sử dụng đúng hay không.

Tôi mới sử dụng Python và tôi không phải là người nói tiếng Anh bản địa, vì vậy tôi xin lỗi nếu bạn không thể hiểu điều gì đó.

Đây là những gì tôi mã

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

Trả lời

5

Bạn không nên sử dụng wx.TRANSPARENT trong việc tạo ra cửa sổ, mà chủ yếu là sử dụng cho các lệnh sơn wxDC. Để làm cho một cửa sổ trong suốt chỉ cần gọi win.SetTransparent (số tiền), với số tiền từ 0-255, 255 có nghĩa là mờ, 0 có nghĩa là hoàn toàn trong suốt. xem http://www.wxpython.org/docs/api/wx.Window-class.html#SetTransparent

Tôi đã sửa đổi mã của bạn, mã sẽ chỉ hoạt động nếu nền tảng của bạn hỗ trợ cửa sổ trong suốt, bạn có thể kiểm tra bằng CanSetTransparent. Tôi đã thử nghiệm nó trên 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

Cảm ơn, đã khắc phục sự cố lỗi, nhưng bây giờ tôi có một vấn đề khác! Các hình chữ nhật lựa chọn được minh bạch quá, vì vậy tôi không thể có được cửa sổ hoàn toàn minh bạch và vẫn thấy sự lựa chọn. Nhưng điều này vẫn ổn. – Franco

Các vấn đề liên quan