Цвет овального холста виджета изменить нельзя
В соответствии с приведенными ниже кодами, если пользователь нажмет <Button-1>
на холсте создается овальный объект.
Ширина этого овального объекта по умолчанию width=5
,
Цвет овального объекта по умолчанию: fill="red"
, Но когда я нажал <Button-1>
Цвет овала был черный.
Если пользователь нажмет <Button-3>
на овальном объекте будет создано контекстное меню (всплывающее). И у этого меню есть две опции (Ширина и Цвет). Параметр ширины работает хорошо, а параметр цвета - нет.
Почему этот вариант цвета не работает в этой программе?
коды:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import tkinter as tk
import tkinter.colorchooser as colorchooser
root = tk.Tk()
canvas = tk.Canvas(master=root)
canvas.pack(fill="both", expand=True)
MENU, ENTRY = None, None
OVALS = {}
def destroy():
global MENU, ENTRY
if MENU is not None:
MENU.destroy()
if ENTRY is not None:
ENTRY.destroy()
def draw_oval(event):
oval = canvas.create_oval(
event.x - 1, event.y - 1, event.x + 1, event.y + 1,
fill="red", width=5
)
canvas.tag_bind(
tagOrId=oval,
sequence="<Button-3>",
func=lambda _event_: button_3_on_object(_event_, oval)
)
OVALS[oval] = event.x, event.y
def button_3_on_object(event, obj):
global MENU
destroy()
MENU = tk.Menu(master=None, tearoff=False)
options = tk.Menu(master=MENU, tearoff=False)
MENU.add_cascade(label="Options", menu=options)
options.add_command(
label="Width",
command=lambda: create_entry(obj)
)
options.add_command(
label="Color",
command=lambda: canvas.itemconfig(
obj, fill=colorchooser.askcolor()[-1]
)
)
MENU.post(event.x_root, event.y_root)
def create_entry(obj):
global ENTRY
destroy()
ENTRY = tk.Entry(master=root, width=5)
ENTRY.place(x=OVALS[obj][-2], y=OVALS[obj][-1])
ENTRY.bind(
"<KeyPress-Return>",
lambda event: change_width(event, obj)
)
def change_width(event, obj):
canvas.itemconfig(obj, fill="blue", width=int(ENTRY.get()))
event.widget.destroy()
canvas.bind("<Button-1>", draw_oval)
root.mainloop()