用画布上的计时器连续移动对象

2024-05-19 13:33:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想移动一个对象并滚动画布窗口,以便使用threading模块中的Timer函数连续跟踪对象, 下面是一个可执行的示例

from tkinter import *
from threading import Timer

x_movement = 3
def move_Timer(object):
    canvas.move(object, x_movement, 0)
    canvas.xview_scroll(3, UNITS)
    Timer(30/1000, lambda: move_Timer(object)).start()


def move_after(object):
    canvas.move(object, x_movement, 0)
    canvas.xview_scroll(3, UNITS)
    master.after(30, lambda: move_after(object))


master = Tk()

canvas_width = 1000
canvas_height = 600
canvas_scrollregion_width = 3000
canvas_scrollregion_height = 3000
canvas = Canvas(master, width=canvas_width, height=canvas_height, bg="black")
canvas.configure(scrollregion=(0, 0, canvas_scrollregion_width,     canvas_scrollregion_height), yscrollincrement='1', xscrollincrement='1')
x = (master.winfo_screenwidth() / 2) - (canvas_width // 2)
y = (master.winfo_screenheight() / 2) - (canvas_height // 2)
master.geometry('%dx%d+%d+%d' % (canvas_width + 4, canvas_height + 4, x, y))
canvas.pack()

x1, y1 = canvas_scrollregion_width/2, canvas_scrollregion_height/2
ball = canvas.create_oval(x1, y1, x1 + 50, y1 + 50, fill="red")
canvas.xview_moveto((x1 - canvas_width/2)/canvas_scrollregion_width)
canvas.yview_moveto((y1 - canvas_height/2)/canvas_scrollregion_height)


master.bind("d", lambda event: move_Timer(ball))
master.bind('<Right>', lambda event: move_after(ball))
master.bind("<Button-1>", lambda event: print(canvas.canvasx(event.x),canvas.canvasy(event.y)))
master.mainloop()

在这个例子中有两个函数,第一个move_Timer(object)使用Timer移动对象(在示例中通过按d键激活)和第二个move_after(object)使用after移动对象(在本例中,通过按arrow_right键激活)。 问题是第一个函数当物体开始移动时,它也开始振动,而第二个函数物体的运动是正确的。我不明白为什么我使用定时器函数时对象会振动,我需要使用它来避免主循环过载。 我正在用python3开发windows10


Tags: 对象lambda函数mastereventmoveobjectwidth
1条回答
网友
1楼 · 发布于 2024-05-19 13:33:44

它振动是因为x峎的运动从来没有改变,甚至y也从来没有改变过。在

我做了一些改变来证明这一点。在

我介绍了y变量…;)

def move_Timer(object,y):
    canvas.move(object, x_movement, y)
    canvas.xview_scroll(3, UNITS)
    #master.after(30, lambda: move_after(object))
    y +=1
    t =Timer(30/1000, lambda: move_Timer(object,y))
    t.start()

甚至改变这条线

^{pr2}$

相关问题 更多 >