我需要实施射击技巧。我需要一个连续的弹丸运动,但我无法设法编码。此时,当我按空格时,程序会冻结。非常感谢帮助。
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()
答案 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"
:)