2015-12-04 86 views
-3

此代碼是一個簡化的打字遊戲,但我無法繼續。需要的功能是:代碼需要繼續...(Python與Tkinter)

  1. 請不要使用類,但只使用FP;
  2. 當單擊按鈕後出現5個隨機字符時,5個字符以5像素/秒的速度下降,同時,您敲擊鍵盤敲擊它們。對於每一次成功的命中,你的分數贏得10點,被擊中的角色將消失。如果不成功,它們將繼續放下直到畫布的底部邊緣。

下面是我的代碼的一部分,我試了幾次,但沒能成功。我該如何繼續?非常感謝!

from Tkinter import * 
from time import * 
import string 
import random 

root = Tk () 
root.title("Typing") 
cvs = Canvas (root , width=400 , height=350 , background="White") 
def Start(): 
    s=random.sample("string.ascii_letters",5) 
    cvs.delete("rand") 
    return cvs.create_text(200,50,text=s,tags='rand',font=('Courier  New',36,'normal')) 
Button(root,text="Start",command=Start,width=30).pack() 
cvs.pack () 
root.mainloop () 
+0

你如何使用「只是FP」,但與TkInter? TkInter接口是OO。 –

+0

另外,從'「string.ascii_letters」'中刪除引號。 –

+0

我不知道,但這是一項功課。不要在OO範式中做,而應該在FP範例中。 –

回答

0

您可以通過編寫繪製動畫的一幀動畫功能的對象,然後安排其自身在未來再次被調用。

例如,要在五個像素移動一個對象在屏幕上向下第二,你可以使用這樣的功能:

def animate(cvs, object_id): 
    # move down five pixels 
    cvs.move(object_id, 0, 5) 

    # call this function again in one second 
    # if the object is still on the screen 
    (x0,y0) = cvs.coords(object_id) 
    if y0 < cvs.winfo_height(): 
     cvs.after(1000, animate, cvs, object_id) 

你將不得不修改來處理多個字符,或致電它爲每個角色一次。這個決定留給你,這只是說明了一般技術。

接下來,您可以設置綁定到<KeyPress>事件,查看被按下的字符,並且如果它與屏幕上的某些內容相匹配,您可以將其刪除。跟蹤屏幕上的內容的一個簡單方法是將角色映射到其畫布ID。

例如:

chars = {} 
for char in random.sample(string.ascii_letters, 5): 
    obj_id = cvs.create_text(...) 
    chars[char] = obj_id 

現在將有一個字典,看起來像你:

{"a": 1, "X", 2, "y", 3, "f", 4, "B", 5} 

現在,您可以移動或刪除ID每個畫布項目。