为什么这个 after 语句不起作用?
Why does this after statement not work?
我在 move_r 函数中有 after 语句。但是当我点击 space 栏时它说
TypeError: move_r() missing 1 required positional argument: 'event'
我比较了解这是什么意思,但我不知道要更改什么 我的程序应该画一个火箭,然后当您单击 space 时,火箭会向上移动。不幸的是,我的程序每次单击 space 时只上升 100,而不是一旦单击 space 就自行上升,这是我的目标。
我的代码是:
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()
这是一枚移动的火箭;它并不能解决您所有的问题,但可以解决您提出的问题:
该事件是一个 key_press - 它在您按下 space 栏时生成,并发送到事件处理程序。
事件处理程序接收事件,并对其进行操作(识别什么事件,并将流引导到它应该的位置 - 这里,移动火箭)。
移动火箭就是这样做的,它通过回调循环移动火箭。
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()
我在 move_r 函数中有 after 语句。但是当我点击 space 栏时它说
TypeError: move_r() missing 1 required positional argument: 'event'
我比较了解这是什么意思,但我不知道要更改什么 我的程序应该画一个火箭,然后当您单击 space 时,火箭会向上移动。不幸的是,我的程序每次单击 space 时只上升 100,而不是一旦单击 space 就自行上升,这是我的目标。 我的代码是:
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()
这是一枚移动的火箭;它并不能解决您所有的问题,但可以解决您提出的问题:
该事件是一个 key_press - 它在您按下 space 栏时生成,并发送到事件处理程序。
事件处理程序接收事件,并对其进行操作(识别什么事件,并将流引导到它应该的位置 - 这里,移动火箭)。
移动火箭就是这样做的,它通过回调循环移动火箭。
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()