2016-12-01 3 views
0

私は、一度にキャンバスに矩形を描画するプログラムを作成しようとしています。瞬時に描画されないように.after関数を使用したいと思います。.afterと.create_rectangleの使い方

現在、私(ストリップダウン)のコードは次のようになります。

root = Tk() 
gui = ttk.Frame(root, height=1000, width=1000) 
root.title("Test GUI")  

rgb_colour = "#%02x%02x%02x" % (0, 0, 255) 

def func(*args): 
    for item in sorted_list: 
     canvas.create_rectangle(xpos, ypos, xpos+10, ypos+10, fill=rgb_colour) 
     xpos += 10 

canvas = Canvas(gui, width=1000, height=1000) 
canvas.grid() 

func() # Code doesn't actually look exactly like this 

root.mainloop() 

と私は描画されている各長方形の間に遅延があるようにしたいです。私は私がやるべきことを集めています

def draw(*args): 
    canvas.create_rectangle(xpos, ypos, xpos+10, ypos+10, fill=rgb_colour) 

for item in sorted_list: 
    root.after(10, draw) 

ループのための私の原稿が長方形を作成するには、XPOS、YPOS、および色の変数が含まれている関数内でその新しい関数をネストされているので、私はこれを行うことはできませんしかし、必要な変数が不足しています。クラス内の関数全体を入れ子にしてクラスの変数を呼び出すことでこれを解決できることは分かっていますが、このコードを非常にシンプルにしたいのですが、矩形の作成を遅らせる方法があればクラスの使用?

編集:この:

from tkinter import * 

root = Tk() 
canvas = Canvas(root, width=400, height=400, bg="white") 
canvas.pack() 

items = [1, 2, 3, 4, 5] 
delay = 100 

def draw_all(*args): 
    global delay 
    x, y = 0, 10 
    for item in items: 
     canvas.after(delay, canvas.create_rectangle(x, y, x+10, y+10, fill="red")) 
     delay += 10 
     x += 10 

root.bind('<Return>', draw_all) 
root.mainloop() 

はまだ、最も簡単な解決策は、それが必要とする他のデータと一緒に項目のリストを取る関数を作成することではAttributeError

答えて

0

を返すから一つの項目をポップリストを作成して矩形を作成し、アイテムがなくなるまで自身を呼び出します。

def draw_one(items): 
    item = items.pop() 
    canvas.create_rectangle(...) 
    if len(items) > 0: 
     canvas.after(10, draw_one, items) 

あなたは、単にafterを使用してcreate_rectangleメソッドを呼び出して、自分自身を呼び出す関数を使用しないことを好む場合は、次のものと

def draw_all(): 
    delay = 0 
    for item in items: 
     canvas.after(delay, canvas.create_rectangle, x0, y0, x1, y1, ...) 
     delay += 10 

を、最初は10ミリ秒で、すぐに描かれた次のことだろう、次の20msなど

+0

ありがとう助けてくれてありがとう、私はあなたの2番目の例を動作させることができませんでした、 'AttributeError: 'int'オブジェクトに属性 '__name __''があります。メインの投稿を編集して、テストコード全体を含めます。 –

+0

@BenWo:あなたは 'after'を間違って使用しています。どのように私がそれを使用するかを詳しく見てください。 ( 'create_rectangle(...)'を使わないでください) –

+0

ありがとう!どのように私はそれを逃すことができるか分からない、私は一見、このメソッドは一見矩形の座標を受け入れるように見て、もう一つのフォローアップの質問があります、どのように塗りつぶしの色を追加するつもりですか? –

関連する問題