Python 如何正确使用tkinter create_line()坐标

Python 如何正确使用tkinter create_line()坐标,python,tkinter,coordinates,line,lines,Python,Tkinter,Coordinates,Line,Lines,本教程使用画布的大小作为线的坐标: 但是,如果我们编辑代码使画布没有填充,我们可以看到这是不正确的。如果仔细观察,第二条create_line()没有正确地与拐角对齐: from tkinter import * master = Tk() w = Canvas(master, width=200, height=100,bd=0,highlightthickness=0) w.configure(bg="black") w.pack() w.create_line(0, 0, 200,

本教程使用画布的大小作为线的坐标:

但是,如果我们编辑代码使画布没有填充,我们可以看到这是不正确的。如果仔细观察,第二条create_line()没有正确地与拐角对齐:

from tkinter import *

master = Tk()

w = Canvas(master, width=200, height=100,bd=0,highlightthickness=0)
w.configure(bg="black")
w.pack()

w.create_line(0, 0, 200, 100, fill="red")
w.create_line(0, 100, 200, 0, fill="red")
master.mainloop()
from tkinter import *

root = Tk()
root.configure(bg="blue")
canvas = Canvas(root, width=3, height=3, borderwidth=0, highlightthickness=0, bg="black")
canvas.pack()

canvas.create_line(0,0,3,3, fill="red")
canvas.create_line(-1,3,3,-1, fill="red")

root.mainloop()
另一个3x3画布示例:

from tkinter import *

root = Tk()
root.configure(bg="blue")
canvas = Canvas(root, width=3, height=3, borderwidth=0, highlightthickness=0, bg="black")
canvas.pack()

canvas.create_line(0,0,3,3, fill="red")
canvas.create_line(0,3,3,0, fill="red")

root.mainloop()
这个问题似乎只影响从左下到右上,或从右上到左下的线条

如果我们将第二条create_line()的坐标更改为-1和3,它现在可以正常工作:

from tkinter import *

master = Tk()

w = Canvas(master, width=200, height=100,bd=0,highlightthickness=0)
w.configure(bg="black")
w.pack()

w.create_line(0, 0, 200, 100, fill="red")
w.create_line(0, 100, 200, 0, fill="red")
master.mainloop()
from tkinter import *

root = Tk()
root.configure(bg="blue")
canvas = Canvas(root, width=3, height=3, borderwidth=0, highlightthickness=0, bg="black")
canvas.pack()

canvas.create_line(0,0,3,3, fill="red")
canvas.create_line(-1,3,3,-1, fill="red")

root.mainloop()
我的问题是:为什么这只影响第二个create_line()?如果3没有变成2,为什么坐标0会变成-1?这是它的工作方式,还是tkinter在正确绘制正斜率方面存在固有问题?在我看来,情况似乎是后者。如果我想制作一个程序,根据给定的一组坐标绘制多条直线,我似乎必须在创建之前计算每个给定的线段是正斜率还是负斜率


因为这个原因,我不得不把我正在制作的程序完全搁置了好几天。有人能提供一些关于这个问题的见解吗?有什么我遗漏了或不明白的吗?

你在第二行出错了

  • Python从
    0
    开始计数,所以左下角是
    (0,2)
    ,而不是
    (0,3)
    。因此,您必须在点
    (0,2)

  • 第一行包含画布外部的点
    (0,0)、(1,1)、(2,2)
    (3,3)
    。类似的第二行应该有
    (0,2)、(1,1)、(2,0)
    (3,-1)
    ,它们位于画布之外。但您不能跳过
    (3,3)
    (3,-1)
    ,因为
    创建线
    不绘制最后一点-最后一点不属于线(类似
    x
    不属于
    范围(x)
    )。如果跳过
    (3,3)
    (3,-1)
    ,则
    创建线
    不会绘制
    (2,2)
    (2,0)

正确的线路

canvas.create_line(0,0,3,3, fill="red")
canvas.create_line(0,2,3,-1, fill="red")
换句话说

  • 第一行
    (a,b,a+3,b+3)
    给出
    (0,0,0+3,0+3)
    =
    (0,0,3,3)
  • 第二行
    (a,b,a-3,b-3)
    给出
    (0,2,0-3,2-3)
    =
    (0,2,3,-1)

Canvas 3x3对我来说太小了,所以我看不出有什么问题。在更大的画布上,我也看不到问题。也许我使用不同的系统(Linux),那么你或我不关心这个细节。我只是使用画布大小来显示create_line()到达了错误的坐标,但这与画布无关。线条应该到达画布的角像素,从而创建一个“X”。它只差一个像素,所以很难看到您是否使用了高分辨率。任何尺寸的画布都有同样的问题。以下是放大的屏幕截图: