Непрерывная линия Python Tkinter с конечными точками, которые не совпадают - PullRequest
1 голос
/ 24 июня 2011

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

Вот код, чтобы вы могли попробовать его и посмотреть, что я имею в виду:

from Tkinter import *

class GUI:
    def __init__(self,root):
        Window = Frame(root)
        self.DrawArea = Canvas(Window)
        self.DrawArea.pack()
        Window.pack()

        self.linewidth = 20

        self.DrawArea.config(cursor="crosshair")
        self.DrawArea.bind("<Button 1>",self.startline)


    def startline(self,event):
        self.startx, self.starty = self.DrawArea.canvasx(event.x),self.DrawArea.canvasy(event.y)

        xa,ya = self.startx-self.linewidth/2 , self.starty+self.linewidth/2
        xb,yb = self.startx+self.linewidth/2 , self.starty-self.linewidth/2

        self.StartPoint = self.DrawArea.create_oval(xa,ya,xb,yb,fill='red',outline='')
        self.Line = None
        self.EndPoint = None

        self.DrawArea.bind("<Motion>",self.updateline)
        self.DrawArea.bind("<Button 3>",self.killline)

    def updateline(self,event):
        if self.EndPoint: self.DrawArea.delete(self.EndPoint)
        if self.Line: self.DrawArea.delete(self.Line)

        x,y = self.DrawArea.canvasx(event.x),self.DrawArea.canvasy(event.y)
        xa,ya = x-self.linewidth/2 , y+self.linewidth/2
        xb,yb = x+self.linewidth/2 , y-self.linewidth/2

        self.Line = self.DrawArea.create_line(self.startx,self.starty,x,y,fill='red',width=self.linewidth)
        self.EndPoint = self.DrawArea.create_oval(xa,ya,xb,yb,fill='red',outline='')

    def killline(self,event):
        self.DrawArea.delete(self.Line)
        self.DrawArea.delete(self.StartPoint)
        self.DrawArea.delete(self.EndPoint)
        self.DrawArea.unbind("<Motion>")


if __name__ == '__main__':
    root = Tk()
    root.title("Line Draw")
    App = GUI(root)
    root.mainloop()

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Вместо того, чтобы рисовать круги в конце линий, вы можете использовать опции capstyle и joinstyle для линии .

Например:

self.Line = self.DrawArea.create_line(self.startx,self.starty, x, y, fill='red',
    width=self.linewidth, capstyle=ROUND, joinstyle=ROUND)
1 голос
/ 24 июня 2011

На моем экране и в моей версии Python (2.5 для Windows XP) круги и линии хорошо сочетаются друг с другом, если вы используете нечетное количество пикселей для ширины линии, по крайней мере для ширины, которую я пробовал. Я думаю, это потому, что ваши координаты не идеальные нульмерные точки, как в математике, а скорее соответствуют пикселям Таким образом, точка или линия минимальной ширины имеют ширину в один пиксель. И именно здесь ваш курсор «живет». Чтобы сделать вещи более сбалансированными, вы должны добавить одинаковое количество пикселей по обе стороны от этой минимальной ширины; таким образом, у вас должно быть нечетное количество пикселей для общей ширины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...