Tkinter逐步执行失败,返回'after'

2024-06-12 02:28:34 发布

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

我不是一个真正的高级程序员,但我通常知道如何在Python上编写我想要的代码,但我不习惯Tkinter。 我用的时候有问题

基本上,我想要一条线逐渐向点击的像素移动,有一个特定的步骤。我希望它每100米移动一次。这是我的密码:

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

但是一旦我右击画布上的某个地方,程序就会冻结1秒(对应于步长*100ms),然后行出现在最后的位置,即我单击的位置。我不明白为什么程序似乎忽略了线路的“路线”

我希望我说得够清楚, 谢谢你的帮助


Tags: 代码fromimport程序eventzonestepwidth
1条回答
网友
1楼 · 发布于 2024-06-12 02:28:34

您需要跟踪移动,以便根据单击的坐标进行计算,以便能够一步一步地向它们移动

您还需要确定函数是在鼠标事件之后调用的,还是通过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()

相关问题 更多 >