2013-04-25 69 views
1

我有一個函數可以從文本文件讀取位置,解析它們,然後使用coords函數將各個對象移動到tkinter畫布上列出的位置。正在從文件中讀取數據並正確解析數據,但由於某些原因,coords函數僅將對象移動到循環上次迭代中文件中列出的最後一個位置。Python 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-------') 
+0

您的壓痕看起來有點小;緊接在「for」後面的行與「for」的縮進位置相同 – 2013-04-25 17:19:55

+0

這只是我複製時的一個問題。原始代碼中的縮進是正確的。我編輯了這篇文章以反映這一點。謝謝! – carpenma 2013-04-25 18:38:07

回答

2

一個很好的GUI開發的經驗法則是永遠不會調用sleep。這會凍結圖形用戶界面,即使只有幾毫秒,仍然是一種不好的做法。

在Tkinter中執行動畫的正確方法是編寫一個顯示單幀的函數,然後使用after重新安排自身。這可以讓事件循環在執行動畫時不斷地爲事件服務。

例如,將for語句的整個主體 - 減去睡眠 - 並將其放入方法中。我們稱之爲「刷新」。使用後,像這樣有此功能重新安排自己:

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在每次更新座標時重新繪製自己。

當然,你需要把在檢查時輸入信息已耗盡了,你可能希望有一個標記,用戶可以通過該請求動畫停止按鈕設置等

+0

這是完美的。謝謝! – carpenma 2013-04-25 19:56:40