Добро пожаловать в stackoverflow!
Поиграв с вашим примером, я считаю, что это связано с размером вашего пера.Вы видите только границу, которая всегда черная.Я немного сократил ваш пример и ниже работает почти так, как ожидалось.Заметили черную рамку вокруг каждого прямоугольника?Вот что вы хотите изменить.
import tkinter as tk
root = tk.Tk()
# --- the canvas ---
canvas = tk.Canvas(root, width=600, height=600)
canvas.grid()
global pensize, pencolor
pensize = 3
pencolor = 'red'
def callback(event):
canvas.create_rectangle(
event.x-pensize, event.y-pensize,
event.x+pensize, event.y+pensize,
fill=pencolor, outline=pencolor)
def setpencolor(color, canvas):
global pencolor
pencolor = color
elements = canvas.find_all()
for element in elements:
canvas.itemconfigure(element, fill=color, outline=color)
canvas.bind("<B1-Motion>", callback)
# --- color tool---
tk.Button(root, text='black',
command=lambda: setpencolor("black", canvas)).grid()
tk.Button(root, text='red',
command=lambda: setpencolor("red", canvas)).grid()
tk.Button(root, text='blue',
command=lambda: setpencolor("blue", canvas)).grid()
root.mainloop()
Теперь попробуйте создать прямоугольник следующим образом:
canvas.create_rectangle(
event.x-pensize, event.y-pensize,
event.x+pensize, event.y+pensize,
fill=pencolor, outline=pencolor
)
Чтобы ответить на последнюю часть вашего вопроса, вы должны теперь найтивсе элементы на холсте и используйте itemconfigure
для изменения их свойств:
elements = canvas.find_all()
for element in elements:
canvas.itemconfigure(element, fill=color, outline=color)