root после не вызывает функцию обратного вызова - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь реализовать root.after в функции, чтобы дать сенсору немного времени для чтения, но я не могу заставить его работать. Вот код функции, который я не могу заставить его работать:

def read_wifi():
global graph_data
try:
    del graph_data
except:
    pass

graph_data=np.array([0])
flag = True
while graph_data.shape[0] < 64:
    while flag == True:
        texto='LX'
        connection.send(texto.encode())

        def callback_after():
            global graph_data
            print('a')              
            graph_data=connection.recv(1024).decode()
            connection.settimeout(3)
            graph_data=graph_data[:-2]
            graph_data=graph_data[0:]
            graph_data=graph_data[:].split()
            graph_data = np.nan_to_num(graph_data)
            try:
                graph_data = np.array([float(q) for q in graph_data])
                flag = False
            except:
                print('Error de lectura del sensor. Reintentando leer...')
            if graph_data.shape[0]<64:
                print('Error de lectura del sensor. Reintentando leer...')

        root.after(500,callback_after)                                  
try:
    graph_data = graph_data*m+b     
except:
    pass
graph_data = np.reshape(graph_data,[4,16])

Как вы можете видеть, я добавил строку для вывода 'a', чтобы проверить, входит ли код в функцию callback_after, но она никогда не печатается, поэтому я думаю, что проблема в root.after (500, callback_after ) строка.

Если я не реализую функцию обратного вызова, кажется, что root после работает, но мое окно tk зависает каждый раз, когда оно читает с датчика. Я также попытался поместить функцию read_wifi в новую ветку, но она продолжает зависать.

Надеюсь, я ясно дал понять.

С уважением.

1 Ответ

0 голосов
/ 04 сентября 2018

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

Как общее практическое правило, внутри программы tkinter не должно быть бесконечного цикла, поскольку mainloop() уже является бесконечным циклом.

Быстрое, неэффективное решение проблемы - вызвать root.update_idletasks() внутри вашего внутреннего цикла. Лучшим решением будет рефакторинг вашего кода, чтобы у вас не было бесконечного цикла (while flag == True:) внутри другого потенциально бесконечного цикла (while graph_data.shape[0] < 64).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...