1

テキスト ファイルから場所を読み取り、それらを解析し、coords 関数を使用して tkinter キャンバスにリストされている場所にそれぞれのオブジェクトを移動する関数があります。データはファイルから読み取られ、正しく解析されていますが、何らかの理由で coords 関数は、ループの最後の反復でファイルにリストされている最後の場所にオブジェクトを移動するだけです。

ループを繰り返すたびにキャンバスを更新する必要がありますか? ありがとう!

これが私のコードです:

def playback():
    fptr = tkFileDialog.askopenfilename()
    filename = open(fptr,"rU")
    if not filename:
        return

    stat.set('REPLAY IN PROGRESS')
    gamestatus[0] = 2
    for line in filename:
        line = line.strip()

        #Example line from input file: 'B:#,#,#,#|L:#,#,#,#|R:#,#,#,#'
        line = line.split('|')
        B_loc = line[0].split(':')[1].split(',')
        L_loc = line[1].split(':')[1].split(',')
        R_loc = line[2].split(':')[1].split(',')

        #Converting strings to ints and lists to tuples to simplify code below      
        B_tup=(int(B_loc[0]),int(B_loc[1]),int(B_loc[2]),int(B_loc[3]))
        L_tup=(int(L_loc[0]),int(L_loc[1]),int(L_loc[2]),int(L_loc[3]))
        R_tup=(int(R_loc[0]),int(R_loc[1]),int(R_loc[2]),int(R_loc[3]))

        #Moving objects to locations from input file        
        playingField.coords(pongball.ball,B_tup)
        playingField.coords(leftpaddle.paddle,L_tup)
        playingField.coords(rightpaddle.paddle,R_tup)
        time.sleep(.02)

    filename.close()
    gamestatus[0] = 0
    stat.set('-------Pong-------')
4

1 に答える 1

2

GUI 開発の非常に優れた経験則は、 を決して呼び出さないことsleepです。これにより GUI がフリーズします。たとえ数ミリ秒であっても、これは悪い習慣です。

Tkinter でアニメーションを行う適切な方法は、単一のフレームを表示する関数を作成し、after. これにより、イベント ループは、アニメーションの実行中に常にイベントを処理できます。

たとえば、for ステートメントの本体全体 (sleep を除く) をメソッドに入れます。これを「リフレッシュ」と呼びましょう。次のように、after を使用してこの関数自体を再スケジュールします。

def refresh():
    line = get_next_line()
    line = line.split('|')
    B_loc = line[0].split(':')[1].split(',')
    ...

    # call this function again in 20ms
    root.after(20, refresh)

あとは、関数として実装するget_next_lineだけで準備完了です。これにより、座標を更新するたびに GUI が自動的に再描画できるようになります。

もちろん、入力が使い果たされたときのチェックを入れる必要があり、アニメーションの停止などを要求するボタンを介してユーザーが設定できるフラグが必要になる場合があります。

于 2013-04-25T17:33:25.287 に答える