2013-08-12 8 views
1

wx.slider와 wx.togglebutton으로 GUI를 만들었습니다. 필자의 목표는 슬라이더를 줄거리의 일종으로 사용하고 토글 단추를 시작/중지 단추로 사용하는 것입니다. 내 생각은 : 토글 버튼을 누르면 슬라이더 값이 증가하기 시작하고 다시 토글 버튼을 누르면 멈 춥니 다. 다음 코드를 사용하고 슬라이더 값을 증가시킬 수 있지만 일단 움직이기 시작하면 슬라이더 끝까지 도달 할 때까지 루프를 멈출 수 없습니다. 토글 버튼을 다시 누르면 증가를 멈출 수 있습니까?토글 버튼으로 루프를 멈추는 방법

def m_toggleBtn1OnToggleButton(self, event): 
    value = self.m_toggleBtn1.GetValue() 
    if value == True: 
     self.m_toggleBtn1.SetLabel("Pause") 
     for i in xrange(100): 
      if i == 100: 
       self.m_slider1.SetValue(100) 
      else: 
       self.m_slider1.SetValue(i) 
       time.sleep(0.1) 
    else: 
     self.m_toggleBtn1.SetLabel("Start") 
     slider_value = self.m_slider1.GetValue() 
     self.m_slider1.SetValue(slider_value) 

도움 주셔서 감사합니다. 안녕하십니까. Ivo.

+0

글쎄, 당신은 단지 하나의 실행 스레드를 가지고 있고, 그것은'for i in xrange (100) :'루프를하고있다. 하나의 스레드가 업데이트 루프를 실행하고 다른 스레드는 이벤트를 수신 할 수 있도록 스레드를 사용해야하므로 사소한 변경이되지는 않습니다. 나는 wx에 익숙하지 않아 어떤 모습 일지 모르지만 http://stackoverflow.com/questions/13654559/how-to-thread-wxpython-progress-bar?rq=1 및 http :// 시작 지점은 /wiki.wxpython.org/LongRunningTasks입니다. – AdamKG

답변

0
내가 할 것이라고 생각 빠른 스크립트를 작성

당신이 원하는 :

import wx 

######################################################################## 
class MyPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 
     self.slider_value = 1 

     self.slider = wx.Slider(self, value=1, minValue=0, maxValue=100, size=(250, -1), 
           style=wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS) 
     self.slider.SetTickFreq(5, 1) 
     self.slider.Bind(wx.EVT_SCROLL, self.onScroll) 
     self.toggle = wx.ToggleButton(self, label="Start") 
     self.toggle.Bind(wx.EVT_TOGGLEBUTTON, self.onToggle) 

     self.timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.onUpdate, self.timer) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.slider, 0, wx.ALL, 5) 
     sizer.Add(self.toggle, 0, wx.ALL, 5) 
     self.SetSizer(sizer) 

    #---------------------------------------------------------------------- 
    def onScroll(self, event): 
     """ 
     Fires when you manually scroll the slider 
     """ 
     value = self.slider.GetValue() 
     self.slider_value = value 

    #---------------------------------------------------------------------- 
    def onToggle(self, event): 
     """ 
     Start/Stop the slider incrementing 
     """ 
     value = self.toggle.GetValue() 
     if value: 
      self.toggle.SetLabel("Pause") 
      self.timer.Start(1000) 
     else: 
      self.timer.Stop() 
      self.toggle.SetLabel("Start") 

    #---------------------------------------------------------------------- 
    def onUpdate(self, event): 
     """ 
     Increment the slider 
     """ 
     self.slider_value += 1 
     self.slider.SetValue(self.slider_value) 

######################################################################## 
class MyFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="Slider Test") 
     panel = MyPanel(self) 
     self.Show() 

if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyFrame() 
    app.MainLoop() 
+0

그게 내가 필요한 것입니다. 당신의 도움에 감사드립니다. 친절합니다. 아이보 – TMoover

1

타이머 사용 그밖에 http://xoomer.virgilio.it/infinity77/wxPython/Widgets/wx.Timer.html

을, 당신은 그런 식으로 변경 될 수있는 변수를 평가하는 while 루프를 사용할 수 있습니다

 while external_variable and i < 100: 

     if i == 100: 
      self.m_slider1.SetValue(100) 
     else: 
      self.m_slider1.SetValue(i) 
      time.sleep(0.1) 
     i += 1 
+0

도와 주셔서 감사합니다. 나는 그런 식으로 타이머를 할 수 있다는 것을 몰랐다.하지만 마이크가 마침내 그것을 이해하는 데 도움이된다. 친절합니다. Ivo – TMoover

+0

문제가없는 친구입니다! –

관련 문제