具有不匹配端点的Python-Tkinter连续线

2024-09-27 07:30:53 发布

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

基本上,我尝试创建一条连续的直线(从用户单击开始,在用户右键单击时结束),我已经开始工作了,但是由于某些原因,端点(椭圆)并没有真正与线条的边完全对齐(当你尝试用多个点绘制一条直线或尝试直角时,这变得非常明显)。。。我什么都试过了,我完全失望了,所以我在这里发帖,看看你们有没有什么想法。。在

下面是代码,你可以试试看我的意思:

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

Tags: selfeventdeflinerootdeleteendpointya
2条回答

您可以使用line^{}^{}选项,而不是在行尾画圆。在

例如:

self.Line = self.DrawArea.create_line(self.startx,self.starty, x, y, fill='red',
    width=self.linewidth, capstyle=ROUND, joinstyle=ROUND)

在我的屏幕上,以及我的Python版本(windowsxp上是2.5),如果使用奇数个像素作为线宽,那么圆和线会很好地结合在一起,至少对于我尝试过的宽度。我认为这是因为坐标不是数学中理想的零维点,而是对应于像素。所以最小宽度点或线是一个像素宽。这就是你的光标“居住”的地方。为了使物体以平衡的方式变厚,你必须在最小宽度的两边添加相同数量的像素;因此你必须有一个奇数个像素作为总宽度。在

相关问题 更多 >

    热门问题