我在应用程序中有一个滑块,其中的面板根据滑块的值显示。我创建了一个函数(通过按下按钮调用),一次将滑块移动一个增量,但它不起作用,因为没有调用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)
答案 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中,您可以在不必引用事件的情况下执行您想要执行的操作,而是直接使用小部件。