Функция tkinter замораживает другую функцию

Я новичок в Python, и у меня есть небольшая проблема с tkinter.
И да, я знаю, как использовать Google, но я не нашел для него решения. Может быть, потому что я действительно не знаю, как и что искать, может быть, из-за моего плохого английского :P.

у меня 3 функции

  • tick() #обновлять время каждые 200 мс, если время не старое
  • refreshT() # обновить температуру (читать из 3 файла)
  • refreshW() #обновить виджет погоды (изображение)

Они вызывают себя через 200 мс, каждые 5 с и каждые 30 м.

Проблема в том, что время не обновляется в течение ~ 2 секунд, если вызывается refreshT.

Я читал кое-что о потоках здесь, но я этого не понял. Итак, мой вопрос: как я могу дать определенной функции более высокий приоритет или сделать что-нибудь еще, чтобы она продолжала работать, что бы ни случилось?

Я не ожидаю, что закончу код, просто немного информации о некоторых модулях или около того, которые делают то, что я ищу.

Я использую raspbian на raspi 3b, если это актуально.

Вот интересная часть кода:

#Python 3.5.3:

#(...)
def tick():
    try:                           #tests if there is an old time to compare
        timeOld                    #if not, set it to none
    except NameError:
        timeOld = None
    timeNew = getTime(1)           #a module ive written, returning the time 
                                   #in a specific order
    if timeOld != timeNew:         #compare (this is to avoid running the
                                   #function to often, better for performance
        clock.config(text=timeNew) #display the new time
        timeOld = timeNew          #set the old time to the actual time
    clock.after(200, tick)         #call itself after 200ms

def refreshT():                        #refreshing temperatures
    tempCpu.config(text=(round(float(open('/sys/class/thermal/thermal_zone0/temp').read())/1000, 1),'°C'))
    tempIns.config(text=(round(float(open('/sys/bus/w1/devices/28-0417a312a0ff/w1_slave').read().split('t=')[1])/1000, 1),'°C'))
    tempOut.config(text=(round(float(open('/sys/bus/w1/devices/28-0517a27018ff/w1_slave').read().split('t=')[1])/1000, 1),'°C'))
    tempCpu.after(5000, refreshT)  #call itself after 5 sec

def refreshW(refresh=True):
    if refresh == True:
        weather_raw = createImg(Ids[1])
        weather.config(image=weather_raw) #reload image
        weather.image = weather_raw
    weather.after(1800000, refreshW) #call itself after 30min
#(...)
root = Tk()
#(...)
clock = Label(
    root,
    font=('Helvetica', 50),
    text=texts[0],
    fg='white',
    bg='black',
    cursor='none'
)
clock.place(
    relx=0.5,
    y=242,
    anchor='n'
)

tempCpu = Label(
    root,
    font=('Helvetica', 40),
    text='$CPU°C',
    fg='white',
    bg='black',
    cursor='none'
)
tempCpu.place(
    relx=0.2,
    y=100,
    anchor='n'
)
tempIns = Label(
    root,
    font=('Helvetica', 40),
    text='$INS°C',
    fg='white',
    bg='black',
    cursor='none'
)
tempIns.place(
    relx=0.5,
    y=100,
    anchor='n'
)
tempOut = Label(
    root,
    font=('Helvetica', 40),
    text='$OUT°C',
    fg='white',
    bg='black',
    cursor='none'
)
tempOut.place(
    relx=0.8,
    y=100,
    anchor='n'
)

tick()
refreshT()
refreshW(False)
root.mainloop()

Если этот код не работает, здесь это полный код на Github.

Надеюсь на помощь или ссылку на ответ, извините, если это дубликат.


person Community    schedule 26.05.2018    source источник
comment
Кажется, проблем довольно много, так какая проблема у вас сейчас? Например, timeOld — это локальная переменная, поэтому timeOld никогда не существует. Кроме того, изображение погоды, вероятно, подвергается сборке мусора. Какой из трех виджетов вызывает проблемы и каким именно образом?   -  person tobias_k    schedule 26.05.2018
comment
Кроме того, я настоятельно рекомендую пройти codereview с этим кодом, так как есть много того, что может быть улучшенный, напр. добавление некоторых пустых строк и комментариев, вспомогательные функции для общего форматирования и размещения меток, избегание if x: return True else return False, смешанные типы возврата в getTime и т. д.   -  person tobias_k    schedule 26.05.2018
comment
О том, в чем проблема: вероятно, чтение температуры занимает около 2 секунд, блокируя поток tkinter так долго. Вы можете использовать для этого многопоточность, но ИМХО это несколько излишне. Вам действительно нужно показывать время в секундах, и если да, то нужно ли обновлять время в секундах с интервалом в 1/5 секунды? В качестве альтернативы вы можете вызвать функцию tick между тремя показаниями температуры.   -  person tobias_k    schedule 26.05.2018
comment
weather не определено.   -  person ivan_pozdeev    schedule 27.05.2018
comment
Ни texts, ни getTime. Голосование за закрытие, так как нет минимально воспроизводимого примера. Ваша задача — выбросить весь код, не относящийся к проблеме, о которой вы спрашиваете.   -  person ivan_pozdeev    schedule 27.05.2018
comment
После удаления всего этого/замены на подделки, WFM. Так что проблема не в логике tkinter. Если фоновая операция занимает много времени, вам необходимо используйте рабочий поток, чтобы избежать зависания другой логики.   -  person ivan_pozdeev    schedule 27.05.2018
comment
Спасибо за вашу помощь. да погода не определена, забыл добавить. если погода и температура освежают одновременно, это занимает больше времени. Иван: если у меня снова возникнут проблемы, я укорочу код в следующем вопросе. Поэтому я попробую решение tobias_k (вызов функции галочки в других). Если это не сработает так, как я хочу, я попытаюсь что-то сделать с потоками...   -  person    schedule 27.05.2018