2010-08-03 4 views
1

Comment faire pour vibrer une fenêtre dans wxPython. Je voudrais un moyen de spécifier combien de temps pour le faire pour et la distance et des trucs comme ça.Fenêtre Vibreur dans wxPython

Y at-il une fonction intégrée que je ne remarque pas ou devrais-je coder moi-même?
(Je pense à déplacer la fenêtre sur le côté à plusieurs reprises, mais je préfère avoir une fonction intégrée qui pourrait être plus rapide.)

Répondre

5

Je ne pense pas qu'il existe une telle fonction, mais vous pouvez facilement faire en utilisant win.SetPosition

par exemple cliquez à l'intérieur du cadre pour vibrer

import wx 

def vibrate(win, count=20, delay=50): 
    if count == 0: return 
    x, y = win.GetPositionTuple() 
    dx = 2*count*(.5-count%2) 
    win.SetPosition((x+dx,y)) 
    wx.CallLater(delay, vibrate, win, count-1, delay) 

app = wx.PySimpleApp() 
frame = wx.Frame(None, title="Vibrator") 
frame.Show() 
frame.Bind(wx.EVT_LEFT_DOWN, lambda e:wx.CallAfter(vibrate, frame)) 
app.SetTopWindow(frame) 
app.MainLoop() 
+0

C'est exactement ce que je cherchais. Vous pouvez voir dans ma réponse ce que je faisais en attendant. Cela ne semble pas fonctionner pour moi, mais je suis à peu près sûr que c'est juste moi (j'ai des IDE différents que certains ont envie de faire du code, d'autres pas). Aucun message d'erreur, donc c'est définitivement le problème de mes interprètes. – avacariu

+0

Quelle version de wxPython utilisez-vous? - AttributeError: l'objet 'module' n'a pas d'attribut 'CallLater' – remosu

+0

@remosu, >>> wx.VERSION -> (2, 8, 10, 1, ''), je me demande quelle est votre version? –

0

Jusqu'à ce que les gens répondent à ma question, je travaillais sur ma propre méthode pour le faire. J'ai seulement commencé la programmation de l'interface graphique, donc je ne connais pas toutes les fonctionnalités de wx, donc j'ai fini par utiliser le module time. La méthode d'Anurag est probablement meilleure car elle utilise des fonctions wx, mais je vais quand même l'afficher ici comme une autre façon de le faire.
NOTE: Cela peut ne pas fonctionner toujours (j'ai du mal à le faire fonctionner avec des interprètes de diff sur le même système d'exploitation). Donc, utilisez la méthode d'Anurag.

import wx 

def vibrate(windowName, distance=15, times=5, speed=0.05, direction='horizontal'): 
    #Speed is the number of seconds between movements 
    #If times is odd, it increments so that window ends up in same location 
    import time 
    if not times % 2 == 0: 
     times += 1 
    location = windowName.GetPositionTuple() 
    if direction == 'horizontal': 
     newLoc = (location[0] + distance, location[1]) 
    elif direction == 'vertical': 
     newLoc = (location[0], location[1] + distance) 
    for x in range(times): 
     time.sleep(speed) 
     windowName.Move(wx.Point(newLoc[0], newLoc[1])) 
     time.sleep(speed) 
     windowName.Move(wx.Point(location[0], location[1])) 

app = wx.App() 

frame = wx.Frame(None, -1, 'Vibrator') 
frame.Show() 

vibrate(frame) 

app.MainLoop()