当前位置: 首页 > 知识库问答 >
问题:

Python tkinter画布根。超出了after()最大递归深度

章博耘
2023-03-14
from tkinter import *

root = Tk()
canvas = Canvas(root, width=400, height=400, bg="white")
canvas.pack()
rect = canvas.create_rectangle(100, 100, 110, 110, fill='blue')
def move_down(event):
    canvas.move(rect, 0, 10)
    root.after(1, move_down(event))
root.bind('<Down>', move_down)
root.mainloop()

我似乎不知道如何使成为root。after()工作。如何修复此问题,使矩形继续向下移动?

共有1个答案

裴宜春
2023-03-14

简而言之:您不能在传递给的函数上加上括号。

    root.after(1,move_down(event))

这一行没有将函数move_down注册为事件后的回调。相反,它会立即调用move_down,如果您没有输入无限递归,它会将move_down的返回值注册为回调。

要解决这个问题,只需使用move_down而不实际调用它,并将event设置为可选变量,因为after不会提供值。您可能还应该使用大于1ms的时间,否则您的矩形将在眨眼之间从屏幕上消失。

from tkinter import *
root = Tk()
canvas = Canvas(root, width=400, height= 400, bg="white")
canvas.pack()
rect = canvas.create_rectangle(100, 100, 110, 110, fill='blue')
def move_down(event=None):
    canvas.move(rect, 0, 10)
    root.after(100,move_down)
root.bind('<Enter>', move_down) #or whatever you're binding it to
root.mainloop()

奖励信息:如果你想问“好的,现在我如何让矩形在我松开键时停止移动?当我按下其他箭头键时,如何使其在其他方向移动?”这需要更复杂的设计。您需要将函数注册到根目录。在之后,根据矩形的速度移动可变数量的像素,该速度会根据独立发生的关键事件进行更改。示例实现:

from tkinter import *
root = Tk()
canvas = Canvas(root, width=400, height= 400, bg="white")
canvas.pack()
rect = canvas.create_rectangle(100, 100, 110, 110, fill='blue')
x_velocity = 0
y_velocity = 0

keys_being_held_down = set()
key_accelerations = {
    "Up": (0, -10),
    "Down": (0, 10),
    "Left": (-10, 0),
    "Right": (10, 0)
}

def key_pressed(event):
    global x_velocity, y_velocity

    #ignore autorepeat events
    if event.keysym in keys_being_held_down: 
        return

    keys_being_held_down.add(event.keysym)
    acceleration = key_accelerations[event.keysym]
    x_velocity += acceleration[0]
    y_velocity += acceleration[1]

def key_released(event):
    global x_velocity, y_velocity
    keys_being_held_down.remove(event.keysym)
    acceleration = key_accelerations[event.keysym]
    x_velocity -= acceleration[0]
    y_velocity -= acceleration[1]

def tick():
    canvas.move(rect, x_velocity, y_velocity)
    print(x_velocity, y_velocity)
    root.after(100,tick)

for key in key_accelerations:
    root.bind("<{}>".format(key), key_pressed)
    root.bind("<KeyRelease-{}>".format(key), key_released)

root.after(100, tick)
root.mainloop()

(这不一定是最好的方法,但它展示了基本方法)

 类似资料:
  • 问题内容: 我使用以下代码解决了Euler项目的问题10,该代码通过强力工作: 这三个功能的工作方式如下: isPrime 检查数字是否为质数; primeList 返回一个列表,其中包含一组在一定范围内且限制为“ n”的素数,并且; sumPrimes 对列表中所有数字的值求和。(不需要最后一个功能,但是我喜欢它的清晰度,特别是对于像我这样的初学者。) 然后,我编写了一个新函数 primeLis

  • 问题内容: 我从星期一开始使用Python进行编程。我很喜欢学习它。但是我一直试图了解如何在tkinter菜单之间切换时避免递归!我确信这是一个非常基本的问题,感谢您宽容我对此主题的无知,但我无法在其他地方找到答案。 我现在正在做的最终是给我错误:RuntimeError:调用Python对象时超出了最大递归深度 这是我目前正在使用的模式。更新:下面的代码现在是完整的隔离副本,再现了我面临的问题!

  • 我对Python很陌生。我写了一个关于返回 x 在排序的重复元素数组 A 中的出现次数的函数: 错误是:运行时错误:超出最大递归深度。有人知道如何解决它吗?

  • 周一开始用Python编程。我喜欢学习它。但是当在tkinter菜单之间切换时,我一直试图理解如何避免递归。我确信这是一个非常基本的问题,我很感激你能容忍我在这个问题上的无知,但是我在别处找不到答案。 我现在所做的是,最终给了我一个错误:RuntimeError:调用Python对象时超出了最大递归深度 这是我目前使用的模式。更新:下面的代码现在是一个完整的、独立的副本,重现了我面临的问题!:D

  • 我不明白为什么我会得到这个最大深度错误。iam试图使用bst递归方法在数组中查找数字索引,下面是我的代码 任何人都可以告诉我代码块中发生了什么 错误块: PS C:\Users\admin\Desktop\DSA

  • 问题内容: 我正在尝试从Django项目网站上的第1篇教程学习Django。我可能会缺少一些明显的东西,但是在遵循所有说明后,当我运行命令时 我在请求的结尾处得到了错误消息,以寻求帮助(为简便起见,我仅将错误消息的重复行的前几行发布)。 这是我在网上找到的一些解决方案/建议,但对我没有帮助。 1)sys.setrecursionlimit(1500)。 这对我不起作用。 2)。DjangoRunt