如何正确使用 tkinter create_line() 坐标
How to correctly use tkinter create_line() coordinates
本教程使用 canvas 的大小作为线条的坐标:
http://effbot.org/tkinterbook/canvas.htm
但是,如果我们编辑代码使 canvas 没有填充,我们可以看到这无法正常工作。如果你仔细观察,第二个 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 的例子 canvas:
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 只是在正确绘制正斜率方面存在固有问题?在我看来,应该是后者。如果我想制作一个基于一组给定坐标绘制多条线的程序,我似乎必须在创建之前计算每个给定线段是正斜率还是负斜率。
因此,我不得不将正在制作的程序完全搁置几天。有人可以提供对这个问题的任何见解吗?有什么我遗漏或不理解的地方吗?
你在第二行写错了
Python 从 0
算起,所以左下角是 (0,2)
,而不是 (0,3)
。所以你必须从点 (0,2)
开始第二行
第一行有点 (0,0), (1,1), (2,2)
和 (3,3)
在 canvas 之外。类似的第二行应该有 (0,2), (1,1), (2,0)
和 (3,-1)
在 canvas 之外。但是你不能跳过 (3,3)
和 (3,-1)
因为 create_line
不绘制最后一个点 - 最后一个点不属于线(类似于 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)
= (0,2,3,-1)
本教程使用 canvas 的大小作为线条的坐标: http://effbot.org/tkinterbook/canvas.htm
但是,如果我们编辑代码使 canvas 没有填充,我们可以看到这无法正常工作。如果你仔细观察,第二个 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 的例子 canvas:
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 只是在正确绘制正斜率方面存在固有问题?在我看来,应该是后者。如果我想制作一个基于一组给定坐标绘制多条线的程序,我似乎必须在创建之前计算每个给定线段是正斜率还是负斜率。
因此,我不得不将正在制作的程序完全搁置几天。有人可以提供对这个问题的任何见解吗?有什么我遗漏或不理解的地方吗?
你在第二行写错了
Python 从
0
算起,所以左下角是(0,2)
,而不是(0,3)
。所以你必须从点(0,2)
开始第二行
第一行有点
(0,0), (1,1), (2,2)
和(3,3)
在 canvas 之外。类似的第二行应该有(0,2), (1,1), (2,0)
和(3,-1)
在 canvas 之外。但是你不能跳过(3,3)
和(3,-1)
因为create_line
不绘制最后一个点 - 最后一个点不属于线(类似于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)
=(0,2,3,-1)