Tkinter Canvas.create_oval не обновляет цвет - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь изменить цвет линии, которую я рисую на холсте, с помощью функции change_red.После нажатия на кнопки, которые запускают функцию, значение из self.color меняется на красный, однако линия все еще рисует черным.

Я пытался изменить self.color в методе init, но он все равно рисуеттолько в черном цвете.

from PIL import Image, ImageTk
import tkinter as tk

class Window(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.color = "black"
        menubar = tk.Menu(self)
        self.config(menu=menubar)
        operation_menu = tk.Menu(menubar, tearoff=0)
        config_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Change Color", menu=operation_menu)
        menubar.add_cascade(label="Help", menu=config_menu)
        config_menu.add_command(label="Exit", command=lambda: exit())
        operation_menu.add_command(label="Red", command=lambda: self.change_red())
        self.im = ImageTk.PhotoImage(Image.open("Test.png"))
        self.geometry("500x500")
        self.title("Image Editor")
        self.resizable(False, False)
        self.im_cv = tk.Canvas(width=300, height=200)
        self.im_cv.pack(expand="yes", fill="both")
        self.im_cv.create_image(50, 10, image=self.im, anchor="nw")
        self.im_cv.bind("<B1-Motion>", self.paint)

    def change_red(self):
        self.color = "red"

    def paint(self, event):
        print(self.color)
        x1, y1 = (event.x - 1), (event.y - 1)
        x2, y2 = (event.x + 1), (event.y + 1)
        self.my_canvas = self.im_cv.create_oval(x1, y1,x2,y2, fill=self.color, width=5)

window = Window()
window.mainloop()

1 Ответ

0 голосов
/ 02 февраля 2019

Вы должны понимать, что свойство width в функциях create_oval на самом деле является width of the border around the outside of the ellipse. Default is 1 pixel. Таким образом, даже если цвет изменился, вы не сможете увидеть его визуально.Для этого вам нужно изменить толщину ваших овалов / эллипсов или установить width=0, то есть без границ.Вот пример:

#I didn't have ImageTk so I have changed it accordingly
import tkinter as tk

class Window(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.color = "black"
        self.t = 2
        menubar = tk.Menu(self)
        self.config(menu=menubar)
        operation_menu = tk.Menu(menubar, tearoff=0)
        config_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Change Color", menu=operation_menu)
        menubar.add_cascade(label="Help", menu=config_menu)
        config_menu.add_command(label="Exit", command=lambda: exit())
        operation_menu.add_command(label="Red", command=lambda: self.change_red())
        self.im = tk.PhotoImage(file="ex.png")
        self.geometry("500x500")
        self.title("Image Editor")
        self.resizable(False, False)
        self.im_cv = tk.Canvas(self, width=300, height=200)
        self.im_cv.pack(expand="yes", fill="both")
        self.im_cv.create_image(50, 10, image=self.im, anchor="nw")
        self.im_cv.bind("<B1-Motion>", self.paint)

    def change_red(self):
        self.color = "red"

    def paint(self, event):
        # print(self.color)
        x1, y1 = (event.x - self.t), (event.y - self.t)
        x2, y2 = (event.x + self.t), (event.y + self.t)
        self.my_canvas = self.im_cv.create_oval(x1, y1, x2, y2, fill=self.color, width=0)

window = Window()
window.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...