@ user1763510, обратите внимание, что в ответе Брайана Оукли у него есть checkForGroupUpdates
еще раз позвонить self.after
. Это связано с тем, что self.after
выполняет только звонок, поэтому для повторных вызовов требуется, чтобы он вызывал себя внутри функции, вызываемой первым вызовом. Таким образом, он продолжает неоднократно называть себя.
То же самое касается функции after_idle()
. Вы должны иметь checkForGroupUpdates
еще раз позвонить after_idle()
внизу.
Вот документация для after
, after_idle
и т. Д. В описании after
есть даже небольшой пример, что делает его понятным.
Документация: http://effbot.org/tkinterbook/widget.htm
Пример из указанной выше ссылке, под after
описание:
#Method 1
class App:
def __init__(self, master):
self.master = master
self.poll() # start polling
def poll(self):
... do something ...
self.master.after(100, self.poll)
Чтобы использовать after_idle
вместо этого, он будет выглядеть следующим образом:
#Method 2
class App:
def __init__(self, master):
self.master = master
self.poll() # start polling
def poll(self):
... do something ...
self.master.update_idletasks()
self.master.after_idle(self.poll)
Обратите внимание на добавление линия self.master.update_idletasks()
. Это рисует графический интерфейс и обрабатывает нажатия кнопок и все. В противном случае after_idle()
будет всасывать все ресурсы и не допускать самообновления графического интерфейса пользователя в mainloop()
.
Альтернативой использованию
self.master.update_idletasks()
self.master.after_idle(self.poll)
является использование:
#Method 3
self.master.update_idletasks()
self.master.after(0, self.poll)
Использование self.master.after(0, self.poll)
мой предпочтительный метод, так как это позволяет мне легко изменить 0 на что-то другое, если я решу я не Не нужно постоянно запускать self.poll. Увеличивая время задержки до по меньшей мере 1 мс, вам больше не нужно звонить self.master.update_idletasks()
.Таким образом, это тоже работает:
#Method 4
self.master.after(1, self.poll)
заметить также, что для всех приведенных выше примеров, вызывая self.poll()
в функции __init__
является то, что пинает все это, и хранение master
в self.master
необходимо просто так, что внутри poll
вы можете позвонить after
или after_idle
функция через self.master.after_idle
, например.
В: Стабилен ли он/он работает?
A: Я проверил тестовый код, используя метод 3 чуть выше в течение ~ 21 часа, и он работал стабильно все время, позволяя графическому интерфейсу использоваться и все.
В: Каково сравнение скорости для каждого метода выше?
А:
- Способ 1: (я не ускорить его испытание)
- Метод 2: ~ 0,44 мс/итерации
- Метод 3: ~ 0,44 мс/итерации
- Метод 4 : ~ 1,61 мс/итерация
Вопрос: Каков мой предпочтительный метод?
A: Способ 3 или 4.
Что вы подразумеваете под «каждый раз, когда mainloop бездействует»? Обычно он простаивает, за исключением случаев, когда вы нажимаете кнопки. –
Да, в идеале я бы хотел, чтобы вышеуказанная программа по существу непрерывно запускала checkForGroupUpdates(), поскольку mainloop обычно должен быть простаивающим большую часть времени. Я бы хотел, чтобы checkForGroupUpdates() запускался каждый раз, когда mainloop простаивает. – user1763510
Итак, вы хотите, чтобы он выполнялся тысячи раз в секунду, когда программа ничего не делает? Нужно ли часто запускаться так часто или может выполняться всего несколько раз в секунду? Если он запускается непрерывно, пока приложение не работает, редко бывает более полезным, чем просто называть его несколько раз в секунду. –