2015-12-04 48 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每个画布项目。