До сих пор, когда мне нужно было работать с несколькими фигурами на холсте tkinter, они были именно такими - фигурами. Я получаю их теги с canvas.find_all()
и манипулирую их геометрией, перемещаясь, изменяя размер и т. Д.
Но я столкнулся с этой проблемой, которую я не могу решить так.
Если я определяю свой собственный класс и начерпываю этот объект на холст, как я могу отслеживать все объекты на холсте, чтобы вызвать их методы?отслеживание собственных объектов на холсте tkinter
Скажем, я определяю класс Bubble
, который рисует шампанское на экране. Через каждую секунду я хочу, чтобы он изменил цвет всех пузырьков на другой цвет, используя их методы change_colour
.
my_list = []
for n in range(10):
bubble = Bubble()
my_list.append(bubble)
while True:
time.sleep(1)
for item in my_list:
item.change_colour()
Я мог бы добавить его в большой «список ола, затем итерацию через него, как я делаю здесь, но и для случаев с большим количеством объектов, это слишком медленно!
Каков правильный способ сделать это?
Как обычно, спасибо за любую помощь!
Как указано, time.sleep()
не имеет никакого смысла, но это не проблема, которую я пытаюсь решить.
Очень вообще говоря, это плохая идея, чтобы иметь либо бесконечные циклы или 'sleep' команды в вашей программе Tkinter. Окно не будет обновляться, и пользовательские команды не будут зарегистрированы, пока ваша функция не закончится и управление не вернется к mainloop. Если вы хотите, чтобы что-то происходило периодически, используйте 'root.after' или' root.after_idle'. Попробуйте это и посмотрите, действительно ли ваш метод 'for item in my_list' действительно является проблемой. – Kevin
Альтернативно, если код, который вы используете здесь, на самом деле не является кодом, который вы используете, это всего лишь код, который вы собирались написать, прежде чем вы решите, что он будет слишком неэффективным: преждевременная оптимизация - это корень всего зла. Вы не можете быть уверены, насколько быстрый код действительно есть, если вы не напишете его и не запустите его и не проверите. – Kevin
Спасибо за совет, это не фактический код, который я использую. Я использовал его, чтобы продемонстрировать свой вопрос как можно более четко, но это не имеет отношения к вопросу. Но спасибо за это. – EriktheRed