我不是一个真正的高级程序员,但是我通常知道如何在Python上编写我想要的代码,但是我不习惯Tkinter。 使用时出现问题。
基本上,我希望一条线逐步移动到所单击的像素。我希望它每100ms移动一次。这是我的代码:
from tkinter import *
from time import *
Fen=Tk()
def clic(event,i=0):
global x0
global y0
step=10
x0=x0+(event.x-x0)/step
y0=y0+(event.y-y0)/step
zone.coords(J,x0,y0-20,x0,y0+20)
if i!=step:
zone.after(100,clic(event,i+1))
zone=Canvas(Fen,width=800,height=500)
zone.pack()
x0=400
y0=250
J=zone.create_line(x0,y0-20,x0,y0+20,width=2)
zone.bind("<Button-3>",clic)
Fen.mainloop()
但是发生的事情是,一旦我在Canvas上的某个位置单击鼠标右键,程序将冻结1秒(对应于步骤* 100ms),然后该行出现在最终位置,即我单击的位置。我不明白为什么程序似乎忽略了该行的“路由”。
我希望我足够清楚, 感谢您的帮助。
答案 0 :(得分:0)
您需要跟踪要根据单击的坐标进行计算的移动,以便能够一步一步地朝它们移动。
您还需要确定是在鼠标事件之后还是通过after
调用了该函数,以便知道如何处理传递的事件。
import tkinter as tk
fen = tk.Tk()
def clic(event, i=0):
global x0, y0
step = 10
if event is not None:
dxdy[0] = (event.x - x0) / (step + 1)
dxdy[1] = (event.y - y0) / (step + 1)
dx, dy = dxdy
x0 = x0 + dx
y0 = y0 + dy
zone.coords(J, x0, y0-20, x0, y0+20)
if i < step:
event = None
j = i + 1
zone.after(100, clic, event, j) # <-- after allows parameters to be passed
else:
dxdy[0] = None
dxdy[1] = None
zone = tk.Canvas(fen, width=800, height=500)
zone.pack()
x0 = 400
y0 = 250
J = zone.create_line(x0, y0-20, x0, y0+20, width=2)
dxdy = [None, None]
zone.bind("<Button-1>", clic)
fen.mainloop()