Цвет овального холста виджета изменить нельзя

В соответствии с приведенными ниже кодами, если пользователь нажмет <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()

0 ответов

Другие вопросы по тегам