Захват событий мыши вне wx.Frame в Python - PullRequest
4 голосов
/ 14 марта 2012

В Python, использующем wxPython, как я могу установить прозрачность и размер окна на основе близости мыши относительно окна приложения или фрейма?

Например. похож на гиперболический зум или док в MAC OS X? Я пытаюсь добиться этого эффекта с помощью PNG с прозрачностью и фасонным окном.

Любые библиотеки или фрагменты кода, которые делают это, тоже подойдут. Спасибо.

Ответы [ 2 ]

6 голосов
/ 15 марта 2012

Вот код, чтобы сделать это. В основном использует подход, упомянутый 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 голосов
/ 15 марта 2012

Я не думаю, что это можно сделать так легко, если мышь находится за пределами основного кадра.Тем не менее, вы всегда можете сделать следующее:

1) Запустить таймер в вашем основном кадре и опрашивать его каждые 50 миллисекунд (или что вам подходит);

2) Как только вы опрашиваете егов вашем обработчике события OnTimer проверьте положение мыши с помощью wx.GetMousePosition () (это будет в screen координат);

3) В том же методе OnTimer получите положение экранаваш кадр, через frame.GetScreenPosition ();

4) Сравните положение мыши с положением кадра (возможно, с помощью евклидова вычисления расстояния или любого другого, который вам подходит).Затем вы устанавливаете прозрачность вашего кадра в соответствии с этим расстоянием (не забудьте поставить его полностью непрозрачным, если мышь находится внутри прямоугольника рамки).

Я сделал это просто для удовольствия, это не должно занять больше5 минут на реализацию.

Надеюсь, это поможет.

Андреа.

...