Функция tkinter останавливает другую функцию - PullRequest
0 голосов
/ 26 мая 2018

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

У меня есть 3 функции

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

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

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

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

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

Я использую 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.

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

...