wxPython - 播放滑块

时间:2014-01-28 00:21:03

标签: python slider playback

我在应用程序中有一个滑块,其中的面板根据滑块的值显示。我创建了一个函数(通过按下按钮调用),一次将滑块移动一个增量,但它不起作用,因为没有调用OnSliderDraw函数。当我使用鼠标手动移动滑块时调用函数,但我想使用PlaySlider函数。

self.Bind(wx.EVT_BUTTON, self.PlaySlider, id=xrc.XRCID("m_buttonPlay"))
self.Slider2 = xrc.XRCCTRL(self, "m_slider3")
self.Bind(wx.EVT_SLIDER, self.OnSliderDraw, id=xrc.XRCID("m_slider3"))

def OnSliderDraw(self, event):
.
.
. something
.
.

def PlaySlider(self, event):
    for i in range(0, self.Slider2.GetMax()):
        self.Slider2.SetValue(i+1)
        time.sleep(0.04)

1 个答案:

答案 0 :(得分:1)

如果您想要更新滑块,请尝试以下操作:

## NOTE: This is untested
def SliderDrawer(self):
    for i in range(0,self.Slider2.GetMax()):
        self.Slider2.SetValue(i+1)
        wx.Yield() ## Added the Yield function
        time.sleep(0.1) ## Increased time so that visual can be seen

def PlaySlider(self,event):
    wx.CallAfter(self.SliderDrawer)
    event.Skip()

您遇到的一个问题是您不会让用户界面自行更新。当事件发生时,将会锁定,直到事件结束。

这可以通过在事件之后调用单独的函数来解决。在该单独的函数中,使用wx.Yield()来允许UI自行更新。

另外,如果你的SliderDraw函数要做其他事情,你应该包含一些比...更具描述性的东西......因为某些东西可能很重要;)

修改

如果我可能误解了你的问题,而你想要做的就是调用OnSlideDraw函数,那么你可以使用在循环中使用wx.Yield()来查看它是否会被调用,或者修改OnSliderDraw不是一个事件,而是在你的循环中调用的东西:

self.Bind(wx.EVT_BUTTON, self.PlaySlider, id=xrc.XRCID("m_buttonPlay"))
# Removed
#self.Slider2 = xrc.XRCCTRL(self, "m_slider3")
self.Bind(wx.EVT_SLIDER, self.OnSliderDraw, id=xrc.XRCID("m_slider3"))

def OnSliderDraw(self):
.
.
. something
.
.

def PlaySlider(self, event):
    for i in range(0, self.Slider2.GetMax()):
        self.Slider2.SetValue(i+1)
        self.OnSliderDraw()
        wx.Yield() # Added the Yield
        time.sleep(0.1) # Increased Time
    event.Skip() # It's important to finish the event with a Skip() to prevent any cross event phenomenon. 

在OnSliderDraw中,您可以在不必引用事件的情况下执行您想要执行的操作,而是直接使用小部件。