Tkinter逐步执行失败,并显示“之后”

时间:2018-08-05 14:48:10

标签: python tkinter

我不是一个真正的高级程序员,但是我通常知道如何在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),然后该行出现在最终位置,即我单击的位置。我不明白为什么程序似乎忽略了该行的“路由”。

我希望我足够清楚, 感谢您的帮助。

1 个答案:

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