Tkinter ......太空侵略者......射击

时间:2014-07-12 15:47:01

标签: python tkinter

我需要实施射击技巧。我需要一个连续的弹丸运动,但我无法设法编码。此时,当我按空格时,程序会冻结。非常感谢帮助。

from tkinter import *

# creates window
window = Tk()
size = window.winfo_screenheight()
window.title("This is a window")
# set up geometry using string formatting operator %
window.geometry("%dx%d+%d+%d" % (1000, 1000, 10, 10))
window.update()
# creates canvas
global canvas
canvas = Canvas(window, bg='green')

# pack is a layout manager
canvas.pack(fill=BOTH, expand=1)
canvas.update()
canvas.create_rectangle(0, 1000, 1000, 0, fill="orange", width=10, outline="white",         tag="border")

def shooting():
    c = canvas.coords("player")
    canvas.create_line(c[0],c[1] + 20,c[2],c[3],width=5,fill="yellow",tag="shot")

    while True:
        canvas.move("shot",0,20)
        canvas.update()

def on_key_press(event):
    global canvas
    c = canvas.coords("player")
    if event.keysym == 'Left' and c[0] > 0:
        canvas.move("player", -20,0)
        print(canvas.coords("player"))
    elif event.keysym == 'Right' and c[2] < 1000:
        canvas.move("player", 20, 0)
        print(canvas.coords("player"))
    elif event.keysym == 'space':
        shooting()


canvas.create_line(500, 950,500,1000, width=15, fill="red",tag="player")
canvas.bind_all('<Key>', on_key_press)
window.mainloop()

1 个答案:

答案 0 :(得分:2)

在Tkinter中,您无法创建无限循环while True或使用time.sleep(),因为这样Tkinter中的其他函数可以由系统执行。

你必须使用

after(time_in_millisecond, function_name_without_()_and_arguments)

例如每隔100ms调用一些函数。

你需要这样的事情

def shooting():
    c = canvas.coords("player")
    canvas.create_line(c[0],c[1] + 20,c[2],c[3],width=5,fill="yellow",tag="shot")
    window.after(100, shooting_after)

def shooting_after():
    canvas.move("shot",0,20)
    canvas.update()
    window.after(100, shooting_after)

现在space不会冻结程序,但这个简单的示例会给您带来另一个问题:

当您按space时,您开始新的"after loop",因此当您按空格键3次时,您将有3 "after loops"。您需要使用方法来停止未使用的"after loop":)