Какая разница между "обновлением" и "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
путь чаще, чем когда-либо.