【问题标题】:Vibrate window in wxPythonwxPython中的振动窗口
【发布时间】:2010-08-03 03:55:43
【问题描述】:

如何在 wxPython 中振动窗口。我想要一些方法来指定它要花多长时间,距离和类似的东西。

是否有我没有注意到的内置函数,或者我必须自己编写代码?
(我正在考虑将窗口横向移动几次,但我宁愿有一个可能更快的内置函数。)

【问题讨论】:

    标签: python user-interface wxpython wxwidgets


    【解决方案1】:

    我不认为有任何这样的功能,但是您可以使用 win.SetPosition 轻松完成

    例如点击内框振动

    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()
    

    【讨论】:

    • 这正是我想要的。您可以在我的回答中看到我同时在做什么。虽然这似乎不适合我,但我很确定那只是我(我有不同的 IDE,有些人感觉像运行一些代码,有些人不喜欢)。没有错误消息,所以这绝对是我的口译员的问题。
    • 你使用的是什么版本的 wxPython? -- AttributeError: 'module' 对象没有属性 'CallLater'
    • @remosu, >>> wx.VERSION -> (2, 8, 10, 1, ''),我想知道你的版本是什么?
    • @vlad003,大多数情况下如果某些东西不起作用,那不是解释器的问题:),无论如何你的解决方案几乎就在那里,但问题是你在同一个事件中多次更新窗口位置,所以基于在操作系统上,它可能会或可能不会工作,具体取决于 wx 是否正确处理事件,所以最好的办法是使用 wxPython 事件更改位置。
    • @remosu ,在 2.7.7.1 版本中 wx.FutureCall 被重命名为 wx.Callafter wxpython.org/recentchanges.php,所以你一定是旧版本
    【解决方案2】:

    在人们回答我的问题之前,我一直在研究自己的方法。我才开始 GUI 编程,所以我不知道 wx 的所有功能,所以我最终使用了time 模块。 Anurag 的方法可能更好,因为它使用 wx 函数,但无论如何我都会在这里发布它作为另一种方法。
    注意:这可能并不总是有效(我无法获取它可以与同一操作系统上的不同解释器一起使用)。所以使用 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多