2011-08-10 4 views
1

Python, Gtk, Cairo로 트랜지션을 애니메이트하는 방법?

나는 PyGtk이되는 최고의 하나와 애니메이션을 만드는 방법을 보여주는 몇 가지 자습서를 보았다 :

https://cairographics.org/cookbook/animationrotation/

이 튜토리얼은 지속적으로 애니메이션을 새로 고치려면 몇 시간을 설정하는 gobject.timeout_add()를 사용합니다.

대신에 버튼이나 체크 박스 등을 클릭하여 트리거 할 수있는 FINITE 애니메이션을 만드는 것이 었습니다.

예를 들어 볼을 그릴 수있는 Button과 DrawingArea가있는 창이있을 수 있습니다. 버튼을 클릭하면 볼이 위아래로 이동하고 멈 춥니 다. 버튼을 다시 클릭하면 공이 움직입니다.

다른 시나리오에서 볼은 화면 왼쪽에있을 수 있습니다. CheckBox를 토글하면 공이 오른쪽으로 이동합니다 (즉석에서가 아니라 전환에서 이동 함). 선택을 해제하면 공이 원래 위치로 되돌아갑니다.

순수 카이로/Gtk (깔끔함, OpenGL, PyGame 없음) 이외의 다른 것을 사용할 계획이 아닙니다. 가능한 것이 좋다고 생각하기 때문에 Gtk에서 공부하고 싶습니다.) 간단한 하나의 파일 스크립트로 GUI 트릭.

질문이 더 광범위한 문제에 관한 것이므로 코드를 추가 할 필요가 없다고 생각합니다. 그러나이 질문을 편집하여 누군가가 더 좋을 것이라고 생각하면 코드를 추가 할 수 있습니다.

도움을 주셔서 감사합니다. 카이로/Gtk는 좋습니다!

EDIT : Jeremy Flores의 정확한 설명을 한 후에이 코드를 사용하여 나왔습니다.이 코드는 쓸모가 없습니다 (버튼을 클릭 할 때마다 공이 오른쪽으로 이동하여 창 밖으로 떨어질 때까지).하지만 요소가 포함되어 있습니다. 더 창의적이고 유용한 물건을 만들 수 있습니다. 누군가 (Jeremy를 포함하여)이 코드에 대해 특별히 언급 할 사항이 있다면, 특히 불필요한 부분을 제거하는 것에 관해서는 기꺼이 듣고 싶습니다. 감사!

#!/usr/bin/env python 
import gtk, gobject 
from math import pi 

class Canvas(gtk.DrawingArea): 
    def __init__(self): 
     super(Canvas, self).__init__() 
     self.connect("expose_event", self.expose) 
     self.set_size_request(400,400) 

     self.x = 20 
     self.y = 20 

     self.counter = 0 

    def movealittle(self): 
     self.x += 1 
     self.counter += 1 
     self.queue_draw() 
     if self.counter <= 20: 
      return True 
     elif self.counter > 20: 
      self.counter = 0 
      return False 

    def expose(self, widget, event): 
     cr = widget.window.cairo_create() 
     rect = self.get_allocation() 

     w = rect.width 
     h = rect.height 

     cr.arc(self.x, self.y, 10, 0, 2*pi) 
     cr.fill() 

def runanimation(widget): 
    gobject.timeout_add(5, canvas.movealittle) 
    print "runanimation call" 

button = gtk.Button("Move") 
button.connect("clicked", runanimation) 

window = gtk.Window() 
canvas = Canvas() 
panel = gtk.VBox() 
window.add(panel) 
panel.pack_start(canvas) 
panel.pack_start(button) 
window.set_position(gtk.WIN_POS_CENTER) 
window.show_all() 
gtk.main() 
+1

타이머 콜백이있는 경우에도 애니메이션 지터 피하기에 대한 의견은 [gtk-window-motion-animation] (http://stackoverflow.com/questions/3131497/gtk-window-motion-animation/6824148#6824148)을 참조하십시오. 불규칙한 간격으로. C 코드 예제가 포함되어 있습니다. –

답변

4

gobject.timeout_add()는 유한 애니메이션에 사용할 수 있습니다. 설정 한 콜백은 False를 반환 할 때까지 계속 호출됩니다.이 시점에서 메서드가 다시 호출되지 않습니다.

예를 들어, 볼을 5 초 동안 애니메이션으로 만들려면 애니메이션이 진행되는 시간을 결정해야합니다. 그런 다음 5 초가 경과하면 메서드는 False를 반환하여 생기. 애니메이션을 다시 시작하려면 timeout_add를 사용하여 콜백을 다시 등록하고 시간 카운터를 재설정하십시오.

자세한 내용은 http://www.pygtk.org/pygtk2reference/gobject-functions.html#function-gobject--timeout-add을 참조하십시오.

+0

좋아요! 나는 그 일을 올바르게하려고 할 시간이있을 때마다 그 일을하려고 노력하고 여기에 어떤 후속 조치도 올리려고 노력할 것입니다. 감사! – heltonbiker

관련 문제