Python 如何在标签末端开始处绘制箭头

Python 如何在标签末端开始处绘制箭头,python,tkinter,label,Python,Tkinter,Label,我想画一个箭头,它从标签结束时开始。我写了一些代码: ` 将Tkinter作为tk导入 from Tkinter import * methods=["m1","m2"] results=["r1","r2"] pos_x_of_image=100 pos_y_of_image=150 frame_size_x=850 frame_size_y=550 def main(): root = Tk() canvas=Canvas(root) canvas.confi

我想画一个箭头,它从标签结束时开始。我写了一些代码: ` 将Tkinter作为tk导入

from Tkinter import *

methods=["m1","m2"]
results=["r1","r2"]
pos_x_of_image=100
pos_y_of_image=150
frame_size_x=850
frame_size_y=550

def main(): 
    root = Tk()
    canvas=Canvas(root)
    canvas.config(width=frame_size_x, height=frame_size_y)
    root.title("window")

    root.geometry('%dx%d'%(frame_size_x,frame_size_y))
    for i in range(0,len(methods)):
        create_label(canvas, methods[i], pos_x_of_image+100, 50 +i*int(frame_size_y/int(len(methods))))
        create_arrow(canvas, pos_x_of_image, pos_y_of_image+50, pos_x_of_image+100, 60 +i*int(frame_size_y/int(len(methods))))
        for j in range(0,2): 
            if j==0:  
                create_label(canvas, methods[i], pos_x_of_image+170+4*int(len(methods[i])), 30 +j*40+i*int(frame_size_y/int(len(methods))))
                create_arrow(canvas,label_width ,label_height , pos_x_of_image+170+4*int(len(methods[i])), 40 +j*40+i*int(frame_size_y/int(len(methods))))
                if j==1:
                    create_label(canvas, results[j], pos_x_of_image+170+4*int(len(methods[i])), 30 +j*40+i*int(frame_size_y/int(len(methods))))
                    create_arrow(canvas,label_width ,label_height, pos_x_of_image+170+4*int(len(methods[i])), 30 +j*40+i*int(frame_size_y/int(len(methods))))
    canvas.pack()

    root.mainloop()

def create_arrow(canvas,x_start,y_start,x_finish,y_finish):
    id = canvas.create_line(x_start,y_start,x_finish,y_finish,arrow=tk.LAST)

def create_label(canvas,method,x_start,y_start):
    w=Label(canvas,text=method)
    w.place(x=x_start,y=y_start)
    return w

if __name__ == '__main__':
    main()

问题在于线条
create_arrow(画布、标签宽度、标签高度、位置x_图像+170+4*int(len(方法[i])、30+j*40+i*int(frame_size_y/int(len(方法)))
,因为我不知道如何获得标签宽度和高度。

您面临的问题是,小部件的宽度在实际绘制之前是不确定的,因为宽度会受到添加到窗口的方式的影响

但是,在您的情况下,可以通过强制更新来计算宽度和高度。例如,将创建标签和箭头的代码更改为:

l = create_label(...)
canvas.update()
label_width = l.winfo_width()
label_height = l.winfo_height()

create_arrow(canvas,label_width ,label_height, ...)
如果你不喜欢强制更新,你还可以做其他事情。例如,您可以使用画布上的文本对象,而不是标签小部件:

l = create_label(...)
bbox = canvas.bbox(l)
label_width = bbox[2]-bbox[0]
label_height = bbox[3]-bbox[1]
...
def create_label(canvas,method,x_start,y_start):
    w = canvas.create_text(x_start, y_start, text=method, anchor="nw")
    return w
...

第二种方法更可取,因为使用
place
添加到画布的对象不会与画布对象一起滚动。

您所说的“winfo方法在此不起作用”是什么意思?您的代码缩进被破坏,因此代码不会运行。我假设
canvas.pack()
root.mainloop()
应该在
main
中,但我不确定。我改进了代码。是的,
pack()
mainloop()
在main中。通常,我想在添加到画布之前,在
canvas.pack()之前获取标签的宽度和高度缩进仍然不正确。请尝试运行您发布的代码。谢谢。这就是我想要实现的目标。溴