在使用 wxPython 的 Python 中,如何根据鼠标相对于应用程序窗口或框架的接近程度来设置窗口的透明度和大小?
例如。类似于双曲线缩放,还是 MAC OS X 中的 The Dock?我正在尝试使用具有透明度和形状窗口的 png 来实现此效果。
任何这样做的库或代码片段也会很棒。谢谢。
在使用 wxPython 的 Python 中,如何根据鼠标相对于应用程序窗口或框架的接近程度来设置窗口的透明度和大小?
例如。类似于双曲线缩放,还是 MAC OS X 中的 The Dock?我正在尝试使用具有透明度和形状窗口的 png 来实现此效果。
任何这样做的库或代码片段也会很棒。谢谢。
这是执行此操作的代码。基本上使用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)在您的主框架中启动一个计时器并每 50 毫秒(或任何适合您的方式)轮询一次;
2) 在 OnTimer 事件处理程序中轮询它后,通过 wx.GetMousePosition() 检查鼠标位置(这将在屏幕坐标中);
3) 在同一个 OnTimer 方法中,通过 frame.GetScreenPosition() 获取框架的屏幕位置;
4)将鼠标位置与框架位置进行比较(可能使用欧几里德距离计算,或任何适合您的方法)。然后根据该距离设置框架透明度(如果鼠标在框架矩形内,请记住将其完全不透明)。
我这样做只是为了好玩,实施起来应该不会超过 5 分钟。
希望这可以帮助。
安德里亚。