Как удалить светло-серая рамка вокруг моего виджета Canvas?

27 rectangletangle [2010-11-30 07:20:00]

Я уже возился с виджетами Tkinter Canvas, чтобы увидеть, могу ли я сделать какие-то эстетически привлекательные виджеты, и у меня есть несколько вопросов.

Во-первых, почему есть светло-серая граница вокруг моего виджета Canvas и как я могу избавиться от него?

Во-вторых, почему верхняя левая позиция в холсте (2,2)? Похоже, что это должно быть (0,0).

Мой текущий script:

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()

python tkinter tkinter-canvas


2 ответа


33 Решение T.P. [2010-11-30 09:31:00]

Раздел 6.8 Почему холст не начинается с 0,0? Часто задаваемые вопросы об использовании Tk описывает явление.

Я смог устранить пограничный артефакт с небольшими изменениями в опубликованном источнике...

Измените это:

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() сразу после утверждения инициализации Canvas показал, что значения по умолчанию 2 для highlightthickness и 0 для border width.


11 Bryan Oakley [2010-11-30 14:58:00]

Короткий ответ: Canvas имеет два компонента, которые влияют на ребра: атрибут border (borderwidth) и кольцо выделения (highlightthickness).

Если у вас ширина рамки и нулевая толщина подсветки, координаты холста начнутся с 0,0. В противном случае эти два компонента холста нарушают координатное пространство.

То, что я чаще всего делаю, - установить эти атрибуты на ноль. Затем, если я действительно хочу границу, я поставлю этот холст внутри рамки и дам рамке рамку.