2012-09-07 4 views
1

여기에서 아무 것도 발견하지 못했기 때문에, 제 질문을했습니다.kivy에서 메트로놈을 만들려고 시도했습니다 - 이벤트 루프 관리

kivy에서 간단한 메트로놈을 만들려고합니다. 기본적으로 설치와 함께 제공되는 Audio 예제를 사용하여 메트로놈 기능을 추가하려고했습니다.

class AudioButton(ToggleButton): 

    filename = StringProperty(None) 
    sound = ObjectProperty(None) 

    def on_filename(self, instance, value): 
     # the first time that the filename is set, we are loading the sample 
     if self.sound is None: 
      self.sound = SoundLoader.load(value) 

    def on_press(self): 
     # stop the sound if it's currently playing 
     if self.sound.status != 'stop': 
      self.sound.stop() 
     self.sound.play() 

당신이 볼 수 있듯이

, 나는 Button에서 ToggleButton에 클래스를 변경했습니다.

self.sound.play()을 사용하여 while 루프를 넣으려고했으나 무한대라는 결과가 발생했습니다. 기본적으로 버튼을 다시 누르면 루프에서 벗어나는 방법을 찾고 있습니다.

필자는 설명서에서 이벤트 루프 관리를 이해하지 못했지만 답변은되어야한다고 생각하지만 이전에는 이벤트 루프를 사용하지 않았습니다. 누군가 이러한 상황에 대한 예제 코드를 제공 할 수 있다면 좋을 것입니다.

답변

6

찾고 싶은 곳은 Kivy 문서에 나와있는 clock events입니다. 이런 종류의 이벤트 구동 시스템에서는 모든 종류의 while 루프가 시스템을 무릎 꿇게합니다. 대신, 주기적으로 일어날 일이 생길 때, 타이머를 설정하고 타이머가 경과 할 때마다 호출 할 기능을 시스템에 요청하십시오.

당신의 경우, 당신은 그저 하나의 메트로놈 틱을 연주하고 다음에 타이머가 경과 할 때까지 완료됩니다.

+0

좋아, 나는 그것을 작동시키지 만 지금은 그만 둘 수 없다 ... Buttonstate는 항상 '정상'이다. on_press function-help 내부에서 clock 이벤트를 호출합니까? ;) –

+2

on_press에서 clock 이벤트를 설정하고 on_release에서 제거하거나 프로그램의 시작 부분에서 클럭 이벤트를 설정하고 매번 버튼 상태를 확인하십시오. 어쨌든, 아마도 그보다 조금 더 복잡한 것이 필요할 것입니다 대부분의 메트로놈이 템포를 변경할 수 있기 때문에 모든 프레임에서 Clock 이벤트를 호출하고 버튼이 눌려져 있는지 확인하고 다음 틱이 발생해야하는지 확인합니다. 그렇다면 소리를 내고 다음 틱의 시간을 계산합니다. 등등. – Tshirtman

+0

대단히 감사합니다. 시계 이벤트를 생각하지 않았습니다. 내 메트로놈은 다른 곳의 속도를 사용하므로 어쨌든 템포 체인지가 발생합니다.) –

관련 문제