Python + Tkinter: перерисовка прямоугольника на холсте на основе некоторого значения%

Я потратил смущающее количество часов, ища способ сделать это... Это для проекта, над которым я работаю, который имеет более сотни элементов холста, которые необходимо обновить из текстового файла. Вот простая версия этого:

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

from tkinter import *


class MyGUI:

def __init__(self, root):
    frame = Frame(root)
    frame.pack()

    self.BoxFillPercent = 0 # the canvas items get their % fill from this value

    self.changeButton = Button(frame, text='SB', command=self.changeRange)
    self.changeButton.grid(row=1, column=1)

    self.hAA = Canvas(frame, width=35, height=35, bg='light blue')
    self.hAA.grid(row=2, column=2)
    self.hAA.create_rectangle(0,0,self.BoxFillPercent*35,35, fill="pink")
    self.hAA.create_text(15, 15, anchor='center', text='AA')

def changeRange(self):
    self.BoxFillPercent = 0.5  
    # When I push the button change the fill amount to 0.5
    ? What do I need to add here to make this work ?

root = Tk()
b = MyGUI(root)
root.mainloop()

Я пытался использовать update и update_idletasks среди множества других вещей, но, должно быть, что-то упускаю.


person lessharm    schedule 11.03.2016    source источник


Ответы (1)


Каждый элемент на холсте имеет идентификатор. Вы можете использовать метод itemconfig холста, чтобы изменить элемент.

rect = self.hAA.create_rectangle(...)
...
self.hAA.itemconfig(rect, ...)

Если вам нужно применить одно и то же изменение к нескольким объектам, вы можете дать этим объектам общий тег, а затем использовать тег вместо идентификатора:

rect1 = self.hAA.create_rectangle(..., tags=("special",))
rect2 = self.hAA.create_rectangle(..., tags=("special",))
...
self.hAA.itemconfigure("special", ...)
person Bryan Oakley    schedule 11.03.2016
comment
Спасибо за быстрый ответ, вернул меня на правильный путь. Я обнаружил, что мне нужно назвать прямоугольник: self.fAA = self.hAA.create_rectangle(...), а затем использовать координаты: self.hAA.coords(self.fAA, ...) ...добавил свой блог в закладки: Д - person lessharm; 11.03.2016