Как нарисовать линию между двумя метками на tkinter Canvas, используя Python? - PullRequest
0 голосов
/ 10 января 2020

Я хочу нарисовать линию между двумя метками на холсте, но я не знаю, как получить координаты меток, чтобы сделать это - мне нужно каждый раз генерировать большое и переменное количество меток, которые я помещаю на canvas используя pack () или grid.

Ниже приведен пример моего кода:

import tkinter as tk

master = tk.Tk()

def line(x1, y1, x2, y2):
    w.create_line(x1, y1, x2, y2)

label1 = tk.Label(master, text="ONE", bg="red", fg="white")
label1.pack(side="left")
label2 = tk.Label(master, text="TWO", bg="blue", fg="white")
label2.pack(side="right")

w = tk.Canvas(master, width=800, height=100)
w.pack()

line(label1.winfo_rootx(), label1.winfo_rooty(), 
     label2.winfo_rootx(), label2.winfo_rooty())

master.mainloop()

Приведенный выше код не генерирует никаких строк, но отображает метки. Как я могу получить правильные координаты для этих меток, чтобы затем я мог использовать их в методе линии, чтобы фактически нарисовать линию, соединяющую две метки?

1 Ответ

0 голосов
/ 13 января 2020

Я обнаружил, что могу делать то, что мне нужно (т.е. рисовать соединительные линии между метками, сгенерированными на холсте), используя геометрию места вместо пакета. Для большого количества автоматически сгенерированных меток это означает использование небольшого метода для генерации координат размещения, но как только эти наборы координат сгенерированы, присоединение меток становится простым.

Например:

label1 = tk.Label(master, text="ONE", bg="red", fg="white")
label1.place(x=50, y=80)
label2 = tk.Label(master, text="TWO", bg="blue", fg="white")
label2.place(x=720, y=80)
line(50, 80, 720, 80)

Другой способ сделать это - создать текстовые объекты Canvas вместо меток. Так что это будет выглядеть следующим образом:

import tkinter as tk

master = tk.Tk()

def line(x1, y1, x2, y2):
    print(x1, y1, x2, y2)
    w.create_line(x1, y1, x2, y2, fill="green")


w = tk.Canvas(master, width=800, height=100)
w.pack()

l1 = w.create_text(50, 20, text="ONE", fill="red", tag="l1")
l2 = w.create_text(720, 20, text="TWO", fill="blue", tag="l2")
x1 = w.coords(l1)[0] + 20
y1 = w.coords(l1)[1]
x2 = w.coords(l2)[0] - 20
y2 = w.coords(l2)[1]
line(x1, y1, x2, y2)
...