2016-04-25 2 views
0

У меня есть инструкция after в функции move_r. Но когда я ударил пробел он говоритПочему это после утверждения не работает?

TypeError: move_r() missing 1 required positional argument: 'event' 

Я относительно знаю, что это значит, но я не могу понять, что изменить мою программу предполагается сделать ракету, а затем, когда вы щелкаете пространство ракета движется вверх , К сожалению, моя программа только увеличивается до 100 каждый раз, когда я нажимаю пробел, а не поднимаюсь сама по себе, когда это место попадает в цель. Мой код:

from tkinter import * 
import random, time 
tk = Tk() 
tk.wm_attributes('-topmost', 1) 
canvas = Canvas(tk, width=1000, height=1000, bd=0) 
canvas.pack() 
def rocket(): #draws rocket 
     rocketbase=canvas.create_rectangle(x2+50, y2-50, x3-50, y3-90, fill ='blue') 
     rrocketfin=canvas.create_rectangle(x2+60, y2-50, x3-40, y3-20, fill ='#e69100') 
     lrocketfin=canvas.create_rectangle(x2+40, y2-50, x3-60, y3-20, fill ='#e69100') 
     mrocketfin=canvas.create_rectangle(x2+54, y2-50, x3-53, y3-20, fill ='#e69100') 
     lrockethead=canvas.create_rectangle(x2+45, y2-125, x3-60, y3-70, fill ='#e69100') 
     rrockethead=canvas.create_rectangle(x2+60, y2-125, x3-45, y3-70, fill ='#e69100') 
def move_r(event): 
    if event.keysym == 'space': 
     global y2 
     global y3 
     y2-=100 
     y3-=100 
     canvas.after(100, move_r) 

x2=460 
y2=940 
x3=570 
y3=900 
r1=None 
tk.bind('<KeyPress-space>', move_r) 
while True: 
    background = canvas.create_rectangle(0, 0, 1000, 1000, fill = 'red') 
    base=canvas.create_rectangle(0, 1000, 1000, 900, fill='#86592d') 
    rocket() 
    tk.update() 


tk.mainloop() 
+1

Вы вызываете 'after' правильно, но ваша функция' move_r' требует аргумента, который вы не включаете в вызов 'after', если это имеет смысл. – Leb

+0

На самом деле вы не могли бы объяснить – Maximus

+0

Недостатки обратного вызова в сторону, что ракета никогда не сдвинется, если вы не активируете ее положение - вы должны избавиться от этого цикла! (кто-то сказал вам в своем последнем вопросе 2 часа назад) –

ответ

1

Вот ракета, которая движется; он не исправляет все ваши проблемы, но он решает вопрос, который вы задали:

Событие - key_press - оно создается при нажатии пробела и отправляется обработчику событий.

Обработчик события принимает событие и действует на него (определяет, какое событие, и направляет поток туда, где он должен - здесь, переместите ракету).

Перемещение ракеты делает это, оно перемещает ракету с помощью цикла обратного вызова.

from tkinter import * 
import random, time 
tk = Tk() 
tk.wm_attributes('-topmost', 1) 
canvas = Canvas(tk, width=1000, height=1000, bd=0) 
canvas.pack() 


def rocket(): #draws rocket 
     rocketbase=canvas.create_rectangle(x2+50, y2-50, x3-50, y3-90, fill ='blue') 
     rrocketfin=canvas.create_rectangle(x2+60, y2-50, x3-40, y3-20, fill ='#e69100') 
     lrocketfin=canvas.create_rectangle(x2+40, y2-50, x3-60, y3-20, fill ='#e69100') 
     mrocketfin=canvas.create_rectangle(x2+54, y2-50, x3-53, y3-20, fill ='#e69100') 
     lrockethead=canvas.create_rectangle(x2+45, y2-125, x3-60, y3-70, fill ='#e69100') 
     rrockethead=canvas.create_rectangle(x2+60, y2-125, x3-45, y3-70, fill ='#e69100') 

def handle_key_press(e): 
    if e.keysym == 'space': 
     move_r() 

def move_r(): 
    global y2 
    global y3 
    y2 -= 50 
    y3 -= 50 
    rocket() 
    tk.update() 
    canvas.after(100, move_r) 



x2=460 
y2=940 
x3=570 
y3=900 
r1=None 
tk.bind('<KeyPress-space>', handle_key_press) 

background = canvas.create_rectangle(0, 0, 1000, 1000, fill = 'red') 
base = canvas.create_rectangle(0, 1000, 1000, 900, fill='#86592d') 
rocket() 
tk.update() 


tk.mainloop() 
Смежные вопросы