【问题标题】:Why does this after statement not work? [duplicate]为什么这个后声明不起作用? [复制]
【发布时间】:2016-08-18 06:12:13
【问题描述】:

我在 move_r 函数中有 after 语句。但是当我按空格键时,它会说

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()

【问题讨论】:

  • 您正确地调用了after,但您的move_r 函数需要一个参数,如果这有意义的话,您不包括在after 调用中。
  • 你真的无法解释
  • 抛开回调缺陷不谈,如果你不启动它的位置,火箭将永远不会移动 - 你也必须摆脱那个 while 循环! (有人在 2 小时前的最后一个问题中告诉过你)

标签: python tkinter widget keyboard-events tkinter-canvas


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多