Захват событий мыши вне wx.Frame в Python
В Python, использующем wxPython, как я могу установить прозрачность и размер окна на основе близости мыши относительно окна приложения или фрейма?
Например. похож на гиперболический зум или док в MAC OS X? Я пытаюсь добиться этого эффекта с помощью PNG с прозрачностью и фасонным окном.
Любые библиотеки или фрагменты кода, которые делают это, тоже подойдут. Благодарю.
2 ответа
Вот код, чтобы сделать это. В основном использует подход, упомянутый 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 минут.
Надеюсь это поможет.
Андреа.