Какая разница между "обновлением" и "update_idletasks"?

Из документации по effbot.org у нас есть следующее о функции update:

Обрабатывает все ожидающие события, вызывает обратные вызовы событий, завершает любое ожидающее управление геометрией, при необходимости перерисовывает виджеты и вызывает все ожидающие незанятые задачи. Этот метод следует использовать с осторожностью, так как он может привести к действительно неприятным состояниям гонки, если он вызывается из неправильного места (например, из обратного вызова события или из функции, которая может быть вызвана любым способом из обратного вызова события и т.д.)..). Если вы сомневаетесь, используйте вместо этого update_idletasks.

С другой стороны, это функция update_idletasks:

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

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

Однако я видел примеры, когда update_idletasks и update используются один за другим, и я не могу понять причину, так как теоретически update делает все, update_idletasks делает update_idletasks.

Что именно представляют собой эти ожидающие события и пустые задачи, о которых говорится в документации? Каковы различия и отношения?

В ответ на это, при каких реальных обстоятельствах я должен использовать update over update_idletasks? Конкретные примеры также приветствуются.

Ответы

Ответ 1

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

Вы верны в обеих учетных записях.

Что представляют собой ожидающие события? События, запланированные с after, в основном. И, как вы также упомянули в своем вопросе, события, которые вызывают перерисовку.

Обстоятельства, когда вы должны использовать update над update_idletasks? Больше никогда. Честно говоря, мой прагматичный ответ: "никогда не вызывайте update, если вызывающий update_idletasks не делает достаточно".

Важно помнить, что update блокируется до тех пор, пока все события не будут обработаны. Фактически это означает, что у вас есть mainloop, вложенный внутри a mainloop. Никогда не рекомендуется иметь бесконечный цикл внутри бесконечного цикла.

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