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

时间:2016-11-02 22:17:33

标签: python tkinter coordinates line lines

本教程使用画布的大小作为行的坐标: http://effbot.org/tkinterbook/canvas.htm

但是,如果我们编辑代码以使画布没有填充,我们可以看到这不能正常工作。如果你仔细观察,第二个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()

使用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 *

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()?为什么坐标0变为-1,如果3不变为2?这是它应该工作的方式,还是tkinter只是正确地绘制正斜率的固有问题?在我看来,后者就是这种情况。如果我想制作一个基于给定坐标集绘制许多线的程序,我似乎必须在创建之前计算每个给定的段是正斜率还是负斜率。

由于这个原因,我不得不将我正在制作的程序完全搁置了好几天。有人可以提供有关此问题的任何见解吗?有什么我缺少或不理解?

1 个答案:

答案 0 :(得分:2)

你在第二行犯了错误

  • 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)因为create_line没有绘制最后一点 - 最后一点不属于行(类似于{{1} }}不属于x)。如果您跳过range(x)(3,3),则(3,-1)无法绘制create_line(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)