2014-07-12 2 views
1

슈팅 메 커닉을 구현해야합니다. 발사체를 계속 움직여야하지만 코드를 관리 할 수는 없습니다. 이 순간에 나는 공간을 누를 때 프로그램이 멈 춥니 다. 도움말 크게 감사하겠습니다.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() 
+0

'shooting()'에서 무한 루프'while True'가있어서 프로그램이 멈 춥니 다. – furas

답변

2

Tkinter를 당신은 무한 루프 while True을 만들거나 Tkinter를이 방법으로 다른 기능은 시스템에 의해 수행 될 수 있기 때문에 time.sleep()을 사용할 수 없습니다.

당신은 예를 들어 일부 기능을 100ms마다 전화를

after(time_in_millisecond, function_name_without_()_and_arguments) 

을 사용해야합니다.

당신은 프로그램을 동결하지 않는 지금이

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을 누르면

당신은 그래서 당신은 공간 (3)를 누르면 새로운 "after loop" 시작을 당신은 3 "after loops" 일 것입니다. 사용하지 않을 방법이 필요합니다 "after loop" :)

관련 문제