在Python中捕获wx.Frame外的鼠标事件

时间:2012-03-14 15:45:00

标签: wxpython mouseevent proximity shaped-window

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

EG。类似于双曲线缩放,还是MAC OS X中的Dock?我试图用透明度和形状窗口的png实现这种效果。

任何执行此操作的库或代码片段都会很棒。感谢。

2 个答案:

答案 0 :(得分:6)

这是执行此操作的代码。基本上使用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()

答案 1 :(得分:2)

如果鼠标位于主框架之外,我认为不能轻易做到这一点。也就是说,您可以随时执行以下操作:

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

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

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

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

我为了它的乐趣而做了它,实现它不应该花费超过5分钟。

希望这有帮助。

安德烈。