настройка элемента tkinter canvas

#python #tkinter #tkinter-canvas

#python #tkinter #tkinter-canvas

Вопрос:

Я пытаюсь создать объект dice, и я хочу иметь возможность управлять цветами точек. Я создал пипсы с черной заливкой и попытался изменить один из них на красный, используя

 self.canvas.itemconfigure(self.pip1, fill='red') 
  

но, похоже, это не имеет никакого эффекта. Ошибки нет, поэтому мне интересно, почему изменение не отображается.

Минимальный рабочий пример:

 from tkinter import *
from tkinter import ttk

class Dice:
    #the x and y instancing variables are for the x and y coordinates of the top left corner of the rectangle
    def __init__(self, win, x, y):
        self.win = win
        self.win.geometry("500x500")
        self.canvas = Canvas(self.win)
        self.canvas.place(x=0, y=0)

        die = self.canvas.create_rectangle(x, y, x 88, y 88, fill='white', width=1)
        offset = 20

        #create 7 circles for pip locations:

        self.pip1 = self.pips(x offset, y offset)
        self.pip2 = self.pips(x offset, y 2*offset)
        self.pip3 = self.pips(x offset, y 3*offset)
        self.pip4 = self.pips(x 2*offset, y 2*offset)
        self.pip5 = self.pips(x 3*offset, y offset)
        self.pip6 = self.pips(x 3*offset, y 2*offset)
        self.pip7 = self.pips(x 3*offset, y 3*offset)

        self.canvas.itemconfigure(self.pip1, fill='red')

    def pips(self, x, y):
        pip = self.canvas.create_oval(x, y, x 9, y 9, fill='black', width=0)

    #def setValue(self, value)

    #def pipsOff(self, pip):



def test():
    x = Dice(Tk(), 50, 50)
    mainloop()
  

Ответ №1:

Первое правило отладки: проверяйте свои данные. Если вы введете инструкцию print или остановите отладчик непосредственно перед вызовом, itemconfigure вы увидите, что self.pip1 имеет значение None . Итак, первое, что вы должны спросить себя: «почему это None

Причина этого None в том, что вы создаете его в методе, но пренебрегаете возвращением идентификатора элемента. Итак, решение вашей проблемы заключается в добавлении return pip в конце функции pips :

 def pips(self, x, y):
    pip = self.canvas.create_oval(x, y, x 9, y 9, fill='black', width=0)
    return pip
  

Комментарии:

1. Да… это делает свое дело. Но чего я не понимаю, так это того, что даже без оператора return в функции pips исходные черные точки все еще были нарисованы. Можете ли вы объяснить, почему это может быть?

2. @sq1020: это потому, что функция просто отлично создала пипсы. Вы просто не возвращали их имя вызывающей функции.