Почему это заявление после не работает?

У меня есть оператор 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()

person Maximus    schedule 25.04.2016    source источник
comment
Вы правильно вызываете after, но ваша функция move_r требует аргумента, который вы не включаете в вызов after, если это имеет смысл.   -  person Leb    schedule 25.04.2016
comment
Это действительно не могли бы вы объяснить   -  person Maximus    schedule 25.04.2016
comment
Помимо недостатков обратного вызова, эта ракета никогда не сдвинется с места, если вы не активируете ее положение — вы также должны избавиться от этого цикла while! (кто-то сказал вам в вашем последнем вопросе 2 часа назад)   -  person Reblochon Masque    schedule 25.04.2016


Ответы (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()
person Reblochon Masque    schedule 25.04.2016