人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()
タイマコールバックがある場合でもアニメーションジッタを避けるためのコメントについては、[gtk-window-motion-animation](http://stackoverflow.com/questions/3131497/gtk-window-motion-animation/6824148#6824148)を参照してください。不規則な間隔で。 Cコードの例が含まれています。 –