2010-02-24 3 views
6

Я кодирую приложение, которое должно выбрать область экрана. Мне нужно поменять курсор на крест, а затем нарисовать прямоугольник по выбору пользователя. Первое, что я искал, - это как манипулировать курсором, и я наткнулся на wxPython. С wxPython я мог бы легко сделать это на фрейме с панелью, дело в том, что мне нужно, чтобы окно было прозрачным, чтобы пользователь мог видеть его экран во время выбора нужной области, но если я сделаю рамку и панель объекты прозрачные, все становится плохо.Python рисунок на экране

Итак, я открыт для любого решения, используя wxPython или не использую его, потому что я действительно не знаю, правильно ли я его использую.

Я новичок в Python, и я не являюсь носителем английского языка, поэтому я сожалею, если вы ничего не понимаете.

Это то, что я закодированы

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

Вы не должны использовать wx.TRANSPARENT в создании окна, который в основном используется для команд wxDC краски. Чтобы сделать окно прозрачным, просто вызовите win.SetTransparent (количество), где сумма от 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

Смежные вопросы