【问题标题】:tkinter move object continuously with Timer in Canvastkinter 在 Canvas 中使用 Timer 连续移动对象
【发布时间】:2019-03-17 16:15:57
【问题描述】:

我想移动一个对象并滚动画布窗口以使用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) 使用 @ 移动对象987654328@(在示例中通过按下arrow_right 键激活)。 问题是,当对象开始移动时,第一个函数也开始振动,而第二个函数的对象移动是正确的。我不明白为什么当我使用 Timer 函数时对象会振动,我需要使用它来不使主循环过载。 我正在使用 python 3 在 Windows 10 上工作

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    它会振动,因为 x_movement 永远不会改变,甚至 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()
    

    甚至改变这一行

    master.bind("d", lambda event: move_Timer(ball,0))
    

    【讨论】:

    • 它对我不起作用,它仍然在振动,无论如何我不想更改 x_movementy_movement 的值,我认为应该有更好的解决方案。顺便说一句,您在代码中同时调用master.after(30, lambda: move_after(object))Timer(30/1000, lambda: move_Timer(object,y))
    • ops 我弄错了,你可以删除 master.after(30, lambda: move_after(object)),反正对我来说它是有效的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多