Я новичок в 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.
Надеюсь на помощь или ссылку на ответ, извините, если это дубликат.
timeOld
— это локальная переменная, поэтомуtimeOld
никогда не существует. Кроме того, изображение погоды, вероятно, подвергается сборке мусора. Какой из трех виджетов вызывает проблемы и каким именно образом? - person tobias_k   schedule 26.05.2018if x: return True else return False
, смешанные типы возврата вgetTime
и т. д. - person tobias_k   schedule 26.05.2018tick
между тремя показаниями температуры. - person tobias_k   schedule 26.05.2018weather
не определено. - person ivan_pozdeev   schedule 27.05.2018texts
, ниgetTime
. Голосование за закрытие, так как нет минимально воспроизводимого примера. Ваша задача — выбросить весь код, не относящийся к проблеме, о которой вы спрашиваете. - person ivan_pozdeev   schedule 27.05.2018