TkInter create_rectangle()固定大小

时间:2016-03-03 13:36:48

标签: python tkinter

在TkInter中使用此函数时调用:

canvas.create_rectangle(canvas.create_rectangle(x0, y0, x0+xsize, y0+ysize,
    outline="black", width=outline_width)

我想要一个矩形我可以预测它的大小。问题在于,取决于outline_width,整体矩形大小会有所不同。

例如,如果我保持不变

(xsize, ysize) = (20,20)

虽然变化outline_width,但我得到了奇怪的尺寸。例如,outline_width=1给出21px的平方,而使用outline_width=4得到24px的平方。 这对我来说是个问题,因为如果我无法预测矩形的大小(即包括轮廓的大小),我的整个绘图都会受到影响。

例如,矩形的总x宽度将由(xsize+outline_width)确定。但另一个问题是,矩形左上角的位置也会根据轮廓宽度而变化。

任何解决方案都可以准确地确定矩形在左上角的位置,并确定最终尺寸?

编辑:包含图片。注意矩形"如何开始"在距离窗口两个完全不同的位置(在X轴上),绘制一条红线作为参考。

enter image description here

无论我outline_width的价值如何,我都希望左上角保持不变。或者至少能够知道它会向右移动多少,所以我可以改变我的坐标以补偿它。

由于

2 个答案:

答案 0 :(得分:2)

矩形是2D范围。如果没有大纲,create_rectangle会将前2个数字视为起始值,将后2个数字视为停止值,与Python的范围(开始,停止)功能一样。具有输入x0,y0,x1,y1的矩形包括像素x,y,其中x0 <= x

当添加轮廓时,NMT reference表示“轮廓位于矩形的顶部和左侧,但在其底部和右侧的矩形之外。”这个引用,通常很好,在这里是错误的,至少在Windows 3.5.1和tk 8.6.4。但是,create_rectangle行为可能取决于操作系统的本机矩形小部件。如果是的话,我想知道。

在我的系统上,上面的规则对于1的边框是正确的,但是每个轮廓图层的添加会交替添加哪些线条在内部以及哪些线条在外部添加。使用一个好的放大镜和下面的代码,我确定了各种轮廓宽度的屏幕矩形的开始和停止值。 (我研究过使用.bbox方法,但有时它似乎偏离了1。)

'''find actual coordinates of canvas rectangle'''

import tkinter as tk
root = tk.Tk()

def report(event):
    print(event.x, event.y)

c = tk.Canvas(root)
c.grid()
w = 0
c.create_rectangle(100, 100, 200, 200, outline='red', fill='yellow',width=0)
c.bind('<Motion>', report)

结果(对x和y使用一个数字)

w start stop
0   100  200
1   100, 201
2    99, 201
3    99, 202
10   95, 205

所需的更正为w//2表示开始,(w+1)//2表示停止。以下行应该生成矩形,这些矩形对于任何宽度都小于矩形最窄尺寸的一半。

c.create_rectangle(100+(w//2), 100+(w//2), 200-(w+1)//2, 200-(w+1)//2,
                   fill='yellow', outline='red', width=w)     

答案 1 :(得分:1)

图片显示x0y0减少了width / 2x1y1增加了相同的数量。现在它看起来画布绘制精确像素而没有任何抗锯齿,因此需要进行一些舍入,我不确定它将如何完成。如果你想要像素精确度,你可能需要一些试验和错误才能把所有东西都放在正确的位置。