I've been messing with the Tkinter Canvas
widget in order to see if I could make some aesthetically pleasing widgets, and I have a few questions.
First, why is there a light grey border around my Canvas widget, and how do I get rid of it?
Secondly, why is the top left most position in the Canvas (2,2)? It seems like it should be (0,0).
My current 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()
Observe the Canvas widget has a border. If you set the attribute "highlightthickness=0" in Canvas, then it will no longer display the border around it. Similarly, we have two buttons, one with a border and the second with no border. To remove the border in the button widget, we have used the parameter "borderwidth=0".
There is no way to change the border color of a widget, the border color is tied to the background color of the widget. Instead, you can turn off the border, and then use a frame widget where you can set the background color of the frame.
Section 6.8 Why doesn't the canvas seem to start at 0,0? of the Tk Usage FAQ describes the phenomenon.
I was able to eliminate the border artefact with slight changes to the posted source...
Change this:
w = Canvas(master, width=150, height=40, bd=0, relief='ridge') w.pack()
to:
w = Canvas(master, width=150, height=40, bd=0, highlightthickness=0, relief='ridge') w.pack()
and this:
x0 = 2 y0 = 2 x1 = 151 y1 = 2
to:
x0 = 0 y0 = 0 x1 = 150 y1 = 0
Interestingly enough, the "borderwidth"
attribute did not make a difference, but I left it in per the FAQ.
Running w.config()
immediately after the Canvas
initialization statement showed the defaults to be 2 for highlightthickness
and 0 for border width
.
The short answer is, the Canvas has two components which affect the edges: the border (borderwidth
attribute) and highlight ring (highlightthickness
attribute).
If you have a border width of zero and a highlight thickness of zero, the canvas coordinates will begin at 0,0. Otherwise, these two components of the canvas infringe upon the coordinate space.
What I most often do is set these attributes to zero. Then, if I actually want a border I'll put that canvas inside a frame and give the frame a border.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With