【问题标题】:Capturing mouse events outside wx.Frame in Python在 Python 中捕获 wx.Frame 之外的鼠标事件
【发布时间】:2012-03-14 15:45:00
【问题描述】:

在使用 wxPython 的 Python 中,如何根据鼠标相对于应用程序窗口或框架的接近程度来设置窗口的透明度和大小?

例如。类似于双曲线缩放,还是 MAC OS X 中的 The Dock?我正在尝试使用具有透明度和形状窗口的 png 来实现此效果。

任何这样做的库或代码 sn-ps 也会很棒。谢谢。

【问题讨论】:

    标签: wxpython mouseevent proximity shaped-window


    【解决方案1】:

    这是执行此操作的代码。基本上使用Infinity77提到的方法。在 Windows 上测试。效果很好!

    import wx
    
    MIN_ALPHA = 64
    MAX_ALPHA = 255
    
    class Frame(wx.Frame):
        def __init__(self):
            super(Frame, self).__init__(None)
            self.alpha = MAX_ALPHA
            self.SetTitle('Mouse Alpha')
            self.on_timer()
        def on_timer(self):
            x, y, w, h = self.GetRect()
            mx, my = wx.GetMousePosition()
            d1 = max(x - mx, mx - (x + w))
            d2 = max(y - my, my - (y + h))
            alpha = MAX_ALPHA - max(d1, d2)
            alpha = max(alpha, MIN_ALPHA)
            alpha = min(alpha, MAX_ALPHA)
            if alpha != self.alpha:
                self.SetTransparent(alpha)
                self.alpha = alpha
            wx.CallLater(20, self.on_timer)
    
    if __name__ == '__main__':
        app = wx.App(None)
        frame = Frame()
        frame.Show()
        app.MainLoop()
    

    【讨论】:

      【解决方案2】:

      如果鼠标在主框架之外,我认为不会那么容易做到。也就是说,您始终可以执行以下操作:

      1) 在您的主框架中启动一个计时器并每 50 毫秒(或任何适合您的时间)轮询一次;

      2) 在 OnTimer 事件处理程序中轮询它后,通过 wx.GetMousePosition() 检查鼠标位置(这将在 屏幕 坐标中);

      3) 在同一个 OnTimer 方法中,通过 frame.GetScreenPosition(); 获取框架的屏幕位置;

      4) 将鼠标位置与框架位置进行比较(可能使用欧几里德距离计算,或任何适合您的方法)。然后根据该距离设置框架透明度(如果鼠标在框架矩形内,请记住将其设置为完全不透明)。

      我只是为了好玩才做的,实施起来应该不会超过 5 分钟。

      希望这会有所帮助。

      安德烈亚。

      【讨论】:

        猜你喜欢
        • 2016-09-06
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        • 2015-12-22
        • 2012-11-23
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        相关资源
        最近更新 更多