48

我一直在弄乱 TkinterCanvas小部件,以查看是否可以制作一些美观的小部件,我有几个问题。

首先,为什么我的 Canvas 小部件周围有浅灰色边框,我该如何摆脱它?

其次,为什么画布(2,2)中最左上角的位置?看起来应该是(0,0)。

我当前的脚本:

from Tkinter import *

master = Tk()
master.configure(bg='black')
master.wm_attributes("-topmost", 1)

w = Canvas(master, width=150, height=40, bd=0,relief='ridge',)
w.pack()

color = 100
x0 = 2
y0 = 2
x1 = 151
y1 = 2

while y0 < 20 :
    r = color
    g = color
    b = color
    rgb = r, g, b
    Hex = '#%02x%02x%02x' % rgb
    w.create_line(x0, y0, x1, y1,fill=str(Hex), width=1)
    color = color - 2
    y0 = y0 + 1
    y1 = y1 + 1

color = 10

while y0 < 40 :
    r = color
    g = color
    b = color
    rgb = r, g, b
    Hex = '#%02x%02x%02x' % rgb
    w.create_line(x0, y0, x1, y1,fill=str(Hex), width=1)
    color = color + 4
    y0 = y0 + 1
    y1 = y1 + 1

mainloop()
4

3 回答 3

77

第 6.8 节 为什么画布似乎不是从 0,0 开始?Tk Usage FAQ描述了这种现象。

我能够通过对发布的源进行轻微更改来消除边界伪影......

改变这个:

w = Canvas(master, width=150, height=40, bd=0, relief='ridge')
w.pack()

到:

w = Canvas(master, width=150, height=40, bd=0, highlightthickness=0, relief='ridge')
w.pack()

还有这个:

x0 = 2
y0 = 2
x1 = 151
y1 = 2

到:

x0 = 0
y0 = 0
x1 = 150
y1 = 0

有趣的是,该"borderwidth"属性并没有什么不同,但我把它留在了FAQ中。

在初始化语句w.config()后立即运行显示默认值为2 for和0 for 。Canvashighlightthicknessborder width

于 2010-11-30T06:31:37.187 回答
17

简短的回答是,Canvas 有两个影响边缘的组件:边框(borderwidth属性)和高亮环(highlightthickness属性)。

如果边框宽度为零,高光厚度为零,则画布坐标将从 0,0 开始。否则,画布的这两个组件侵犯了坐标空间。

我最常做的是将这些属性设置为零。然后,如果我真的想要一个边框,我会将该画布放在一个框架内并给框架一个边框。

于 2010-11-30T11:58:34.827 回答
0

如果在画布类实例中添加 highlightthickness 会引发错误(它最近为我做)。将其添加到配置中,如下所示:

canvas=Canvas(width=206,height=260, bg=YELLOW)
canvas.config(highlightthickness=0)
于 2021-07-25T20:52:12.903 回答