【问题标题】:Python drawing on screen屏幕上的 Python 绘图
【发布时间】:2010-02-24 04:18:30
【问题描述】:

我正在编写一个需要选择屏幕区域的应用程序。我需要将光标更改为十字,然后在用户选择上绘制一个矩形。我搜索的第一件事是如何操作光标,我遇到了 wxPython。使用 wxPython,我可以轻松地在带有面板的框架上执行此操作,问题是我需要窗口是透明的,以便用户在选择所需区域时可以看到他的屏幕,但是如果我制作框架和面板对象透明,一切都会出错。

所以,我对任何解决方案都持开放态度,无论是使用 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()

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    您不应该在窗口创建中使用 wx.TRANSPARENT,它主要用于 wxDC 绘制命令。要使窗口透明,只需调用 win.SetTransparent(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()
    

    【讨论】:

    • 谢谢,解决了错误的问题,但现在我遇到了另一个问题!选择矩形也变得透明,所以我不能让窗口完全透明并且仍然看到选择。但这暂时没关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多