2010-08-03 71 views
1

如何震动wxPython中的窗口。我想要一些指定多久的时间和距离等方式。wxPython中的震动窗口

是否有一个内置函数我没有注意到,还是我必须自己编写它?
(我想把窗户向旁边移动几次,但我宁愿有一个内置功能可能会更快。)

回答

5

我不认为有任何这样的功能,但你可以轻松地做它使用win.SetPosition

eg点击里面的框架振动

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

这正是我所期待的。你可以在我的回答中看到我在做什么。 虽然这似乎并没有为我运行,但我敢肯定,这只是我(我有不同的IDE,有些人觉得运行一些代码,有些人不)。没有错误信息,所以这绝对是我的解释者的问题。 – avacariu 2010-08-03 05:48:56

+0

你使用的是什么版本的wxPython? - AttributeError:'module'object has no attribute'CallLater' – remosu 2010-08-03 08:22:48

+0

@remosu,>>> wx.VERSION - >(2,8,10,1,''),我想知道你的版本是什么? – 2010-08-03 14:02:10

0

直到人们回答我的问题,我一直在做我自己的做法。我只开始GUI编程,所以我不知道wx的所有功能,所以我最终使用了time模块。 Anurag的方法可能更好,因为它使用了wx函数,但是我会在这里发布这个作为另一种方式。
NOTE:这可能无法正常工作(我无法在同一OS上使用差异解释器)。所以使用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()