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