2010-02-24 14 views
6

मैं एक ऐसे एप्लिकेशन को कोड कर रहा हूं जिसे स्क्रीन के क्षेत्र का चयन करने की आवश्यकता है। मुझे कर्सर को एक क्रॉस में बदलने की जरूरत है और उसके बाद उपयोगकर्ता चयन पर एक आयत खींचें। पहली चीज़ जो मैंने खोजी है वह कर्सर में हेरफेर करने का तरीका है और मैं wxPython में आया था। WxPython के साथ मैं आसानी से पैनल के साथ फ़्रेम पर ऐसा कर सकता हूं, बात यह है कि मुझे विंडो को पारदर्शी होने की आवश्यकता होगी ताकि उपयोगकर्ता वांछित क्षेत्र का चयन करते समय अपनी स्क्रीन देख सकें, लेकिन यदि मैं फ़्रेम और पैनल बनाता हूं वस्तुओं पारदर्शी सब कुछ छोटी गाड़ी हो जाता है।स्क्रीन पर पाइथन ड्राइंग

तो, मैं किसी भी समाधान के लिए खुला हूं, या तो wxPython का उपयोग कर रहा हूं या इसका उपयोग नहीं कर रहा क्योंकि मुझे वास्तव में पता नहीं है कि मैं इसका सही उपयोग कर रहा हूं या नहीं।

मैं पाइथन के लिए नया हूं और मैं मूल अंग्रेजी स्पीकर नहीं हूं, इसलिए मुझे खेद है कि अगर आप कुछ समझ नहीं सकते हैं।

यह है कि मैं क्या

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 रंग आदेश के लिए प्रयोग किया जाता है। खिड़की पारदर्शी बनाने के लिए बस जीतें .सेट ट्रांस्पेरेंट (राशि), जहां राशि 0-255 से है, 255 का अर्थ है अपारदर्शी, 0 का मतलब पूरी तरह से पारदर्शी है। देखें http://www.wxpython.org/docs/api/wx.Window-class.html#SetTransparent

मैंने आपके कोड को संशोधित किया है, यह केवल तभी काम करेगा जब आपका प्लेटफार्म पारदर्शी विंडो का समर्थन करता है, आप इसे CanSetTransparent द्वारा देख सकते हैं। मैंने विंडोज एक्सपी पर इसका परीक्षण किया।

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

संबंधित मुद्दे