2016-07-12 6 views
0

tkinterのキャンバスで、whileループでスリープ状態にするために検索します。 Python2で 目的はランダムに動いているポイントを持って、X秒ごとにリフレッシュします(そして、私は正確にしたいものを作るために大きなスクリプトを書くことができます)。今のtkinterのスリープ(python2)

は、私はこれを作った:

(フランスの変数名のため申し訳ありません:°)
import Tkinter, time 

x1, y1, x2, y2 = 10, 10, 10, 10 
def affichage(): 
    global x1, y1, x2, y2 
    can1.create_rectangle(x1, y1, x2, y2, fill="blue", outline="blue") 
def affichage2(): 
    global x1, y1, x2, y2 
    can1.delete("all") 
    can1.create_rectangle(x1, y1, x2, y2, fill="blue", outline="blue") 

fen1 = Tkinter.Tk() 
can1 = Tkinter.Canvas(fen1, height=200, width=200) 
affichage() 
can1.pack() 
temps = 3000 

while True: 
    can1.after(temps, affichage2) 
    x1 += 10 
    y1 += 10 
    x2 += 10 
    y2 += 10 
    temps += 1000 
fen1.mainloop() 

fen1.destroy() 

だから、私は.after機能を試してみましたが、私は私が望むどのようにそれを増やすことはできません。マルチスレッドでは可能かもしれないが、より簡単な解決策が必要だ。

ご存知ですか?

+1

'time.sleep(T)' 'T 'は、秒単位で測定され –

+0

' fen1.mainloop()アプリケーションが起動したとき、それは '下回っているので、それが実行されることはありません場合は、'、一部であり、 True 'は'休憩 'なしではウィンドウが決して表示されません。 –

+0

他の人が「スリープ」の問題を指摘しています。また、長方形の削除と再作成に問題があります。キャンバスには既存のオブジェクトを移動する機能があります。オブジェクトを破棄して再作成するよりも効率的です。 –

答えて

1

sleepはイベントループを停止させるため、Tkinterとうまく混合されないため、ウィンドウがロックされてユーザーの入力に応答しなくなります。 X秒ごとに何かを起こす通常の方法は、afterに渡す関数の中にafterコールを入れることです。試してみてください:

import Tkinter, time 

x1, y1, x2, y2 = 10, 10, 10, 10 
def affichage(): 
    global x1, y1, x2, y2 
    can1.create_rectangle(x1, y1, x2, y2, fill="blue", outline="blue") 
def affichage2(): 
    global x1, y1, x2, y2 
    can1.delete("all") 
    can1.create_rectangle(x1, y1, x2, y2, fill="blue", outline="blue") 
    x1 += 10 
    y1 += 10 
    x2 += 10 
    y2 += 10 
    can1.after(1000, affichage2) 

fen1 = Tkinter.Tk() 
can1 = Tkinter.Canvas(fen1, height=200, width=200) 
affichage() 
can1.pack() 
temps = 3000 

can1.after(1000, affichage2) 
fen1.mainloop() 

fen1.destroy()