2017-10-31 41 views
0

tkinterを使って小さなプログラムを書いて、私がプログラムに与えているパラメータに基づいて数字を生成しました(guiインターフェイス経由)。私は図を直接tkinterCanvasを使って描いています。今度は、一連の図を生成し、アニメーション化されたループに入れたいと思います。私はgifアニメーションとload it into the figureを生成することができますが、私はこれを直接tkinterで行うことができるかどうかです。私はすべてをループに入れることができますが、イベントハンドラを失います。その他のオプションは?tkinterでアニメーションを生成する


編集

ここでは簡単なスクリプトです:

#!/usr/bin/python 
from Tkinter import * 
import ttk 
import numpy as np 


colors = {1:'#F00', 
      2:'#0F0', 
      3:'#00F', 
      4:'#FF0', 
      5:'#0FF'} 

root = Tk() 
canvas = Canvas(root,width=400,height=400) 
label = Label(root,text='seed') 
values = StringVar() 
combo = ttk.Combobox(root) 


def painter(event): 
    seed = int(combo.get()) 
    np.random.seed(seed) 
    nrows = 10 
    ncols = 10 
    Y = 0 
    dx = 400/nrows 
    dy = 400/ncols 
    for i in range(nrows): 
     X = 0 
     for j in range(ncols): 
      n = np.random.randint(1,5) 
      col = colors[n] 
      canvas.create_rectangle(X,Y,X+dx,Y+dy,width=1,fill=col) 
      X += dx 
     Y += dy 


canvas.grid(column=0,row=0,rowspan=2) 
combo.grid(row=1,column=1) 
label.grid(row=0,column=1) 
combo['values'] = [1,2,3,4] 
combo.bind('<<ComboboxSelected>>',painter) 
combo.current(0) 



painter(None) 


root.mainloop() 

私は無限ループを含めるようにpainter機能を変えることができるが、この方法は、私がmainloop()に到達することはありませんので、私が呼び出す必要がありますこれは、メインループが作成された後にのみ、どのようにですか?

+0

あなたが行ったことを示すためにいくつかのコードを提供できますか? – Sraw

+1

あなたはアニメーションの次のフレームを描画するために 'after'を繰り返し呼び出すことができます。あなたが望むときに' after'呼び出しが正確にトリガされない場合に注意してください(指定した遅延の後にある時間だけ呼び出されることを保証します)あなたのアニメーションが不規則に見えたり、アニメーションが希望よりも遅くなる可能性があります。 –

+0

@JamesKent、関数の後にこれを追加しますか? – Yotam

答えて

1

Tkinterのキャンバスを使用して、いくつかのアニメーションの簡単な例:

import tkinter as tk 

class App(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.title("Canvas animation example") 

     self.c = tk.Canvas(self, width=400, height=400) 
     self.c.pack() 

     self.f_index = 0 # index so we know which frame to draw next 
     # array to hold our frame data, 
     # you'll probably need this to hold more than 
     # just a set of coordinates to draw a line... 
     self.f_data = [] 

     for num in range(0, 400, 5): # make up a set of fake data 
      self.f_data.append([num, num, num+10, num+10]) 

    def next_frame(self): 
     data = self.f_data[self.f_index] # fetch frame data 
     self.c.delete('all') # clear canvas 
     self.c.create_line(*data) # draw new frame data 
     self.f_index += 1 # increment frame index 
     if (self.f_index >= len(self.f_data)): # check and wrap if at end of sequence 
      self.f_index = 0 
     self.c.after(50, self.next_frame) # call again after 50ms 

if __name__ == "__main__": 
    app = App() 
    app.next_frame() # called manually once to start animation 
    # could be started with 'after' instead if desired 
    app.mainloop() 

ノートあなたが遅く、このコードが実行されます削除して再描画したい複数の項目もの。あなたは現実的な期待を持っている必要があります、いくつかの10のアイテムはうまくいくでしょう、いくつか100は、まともなPCでOKかもしれませんが、アイテムの1000は非常に悪い行います。

関連する問題