Способ использования root.after() рекурсивно в Tkinter

125
15

В Tkinter я использую root.after() для создания метки потока и обновления GUI в соответствии с возвращаемым значением функции. Я хочу использовать ту же функцию рекурсивно и обновлять метку в соответствии с изменением возвращаемого значения функции.

Но, кажется, поток вызывает функцию только один раз и заканчивается. Как я могу заставить мой поток вызывать функцию рекурсивно? Вот код, который печатает getData() только дважды и заканчивается.

def recusriveDataFetch( self ):
self.sched = sched.scheduler(time.time, time.sleep)
self.sched.enter(100, 2, self.getData(), ()) #create getData() event after every 100 ms
self.sched.run()

def rootWindow( self ):
self.root = Tkinter.Tk()
self.root.title("Hello World")
self.getData()
self.root.after( 1000, thread.start_new_thread, self.recusriveDataFetch, () )
self.root.mainloop()

def getData( self ):
print " When I will be called multiple times\n "

Любая помощь будет оценена. благодаря

спросил(а) 2021-01-25T16:30:38+03:00 4 месяца, 4 недели назад
1
Решение
77

Просто запустите функцию getData снова вызовите метод root.after:

def rootWindow(self):
self.root = Tkinter.Tk()
self.root.title("Hello World")
self.getData()
self.root.mainloop()

def getData(self):
print("I will be called multiple times")
self.root.after(1000, self.getData)

Надеюсь это поможет!

ответил(а) 2021-01-25T16:30:38+03:00 4 месяца, 4 недели назад
63

Что-то примечание здесь, должно быть очень осторожным, как вы это реализуете. Tkinter не является потокобезопасным, и я был укушен этим пару раз. Мне это очень нравится в инструментах GUI, но вы должны помнить об этом. Просто убедитесь, что ничто внутри потока не взаимодействует ни с чем в экземпляре Tkinter.

Как я могу это сделать:


def recusriveDataFetch(self):
self.sched = sched.scheduler(time.time, time.sleep)
self.sched.enter(100, 2, self.getData(), ()) #create getData() event after every 100 ms
self.sched.run()

def dataFetchWrapper(self, repeat=True):
thread.start_new_thread(self.recusriveDataFetch)
if repeat:
self.root.after(100, self.dataFetchWrapper)

def rootWindow(self):
self.root = Tkinter.Tk()
self.root.title("Hello World")
self.getData()
self.root.after(1000, self.dataFetchWrapper)
self.root.mainloop()

def getData(self):
print " When I will be called multiple times\n "

ответил(а) 2021-01-25T16:30:38+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема