цвет заливки для прямоугольника остается черным, хотя, когда я устанавливаю его на красный - PullRequest
0 голосов
/ 17 декабря 2018

(выдержка из кода моей программы)

global pensize
global rect1
try:
    pensize
except:
    pensize = 0
global pencolor
try:
    pencolor
except:
    pencolor = "red"
def callback(event):
    global rect1
    rect1 = canvas.create_rectangle(event.x-pensize, event.y-pensize, event.x+pensize, event.y+pensize, fill="red")
    print(pencolor)
def setpencolor(color):
    global pencolor
    pencolor = color
    global rect1
    canvas.itemconfig(rect1, fill=pencolor)
    print("Pencolor set to"+str(pencolor))

#    --- window properties ---
# --- the canvas ---
canvas= Canvas(root, width=600, height=600)
canvas.bind("<B1-Motion>", callback)
canvas.pack(side = RIGHT)
# --- the menubar ---
menubar = Menu(root)
menubar.add_command(label="Exit", command=root.quit)
#   --- color tool---
colormenu = Menu(menubar, tearoff=0)
colormenu.add_command(label="Black", command=lambda: setpencolor("black"))
colormenu.add_command(label="Red", command=lambda: setpencolor("red"))
colormenu.add_command(label="Blue", command=lambda: setpencolor("blue"))
menubar.add_cascade(label="Color", menu=colormenu)

Это часть программы рисования, которую я делаю.Я хотел бы сделать так, чтобы, когда пользователь меняет цвет, он изменял не только цвет пера, но и все остальное, что он рисовал.Ни одна из этих концепций не работает, хотя.Цвет заливки для прямоугольника остается черным, даже если цвет пера явно установлен на «красный».Хотя он должен изменить цвет всего остального, он абсолютно ничего не делает.Что я делаю не так?

1 Ответ

0 голосов
/ 17 декабря 2018

Добро пожаловать в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...