2011-08-10 11 views
1

Python、Gtk、Cairoで遷移をアニメーション化する方法は?

は、私は私はPyGtk、これをされて最高の1でアニメーションを作成する方法を示すいくつかのチュートリアルを見てきました:

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

このチュートリアルでは、常にアニメーションをリフレッシュするために、いくつかのクロックを設定するgobject.timeout_add()を使用しています。

代わりに、FINITEアニメーションを作成して、ボタンやチェックボックスなどをクリックしてトリガーすることができます。

たとえば、ボールを描画したButtonとDrawingAreaを持つウィンドウを作成できます。 ボタンをクリックすると、ボールが上下に移動して停止します。もう一度ボタンをクリックすると、ボールは移動を繰り返します。

別のシナリオでは、ボールは画面の左側にある可能性があります。 CheckBoxを切り替えると、ボールは右に移動します(瞬時にではなく、トランジションで移動します)。チェックを外すと、ボールは元の位置に戻ります。

純粋なカイロ/ Gtk(クラッタなし、OpenGLなし、PyGameなし)以外のものを使用する予定はありません。可能でなければならないと感じているので、Gtkを勉強して)簡単な1ファイルスクリプトを使用したGUIトリック

問題はより広範な問題であるため、コードを追加する必要はないと思いますが、この質問を編集して誰かがより良いと感じる場合は、コードを入力することができます。

お読みいただきありがとうございました!そしてカイロ/ Gtkは素晴らしいです!

EDIT:Jeremy Floresからの正確な説明の後、私はこのコードを使いました。このコードは無用です(ボタンがクリックされるたびにボールが右に移動し、ウィンドウから落ちるまで)。より創造的で有用なものを作ることができます。もし誰か(ジェレミーを含む)がこのコードについて何か言いたいことがあれば、特に不必要な部分を取り除くことについて、私はとても喜んで聞いています。ありがとう!

#!/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

関連する問題