Периодическая ошибка: AttributeError: у объекта 'App' нет атрибута equipTemp
Я играл с этим кодом в течение дня, чтобы получить показания от моего датчика температуры.
Как ни странно, я получаю эту ошибку, вероятно, 4 из 5 раз, когда я запускаю этот код:
Traceback (последний вызов был последним): Файл "/ home / pi / Code-working-library
/ Temp_and_window_working ds18b20.py ", строка 118, в
app.equipTemp.set(round(read_temp(),1)) AttributeError: у объекта "App" нет атрибута "equipTemp"
Вот мой код:
from Tkinter import *
import os
import glob
import time
import subprocess
import re
import sys
import time
import threading
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
#28-000005c6ba08
#28-000005c70f69
#28-000005c80eb9
#the_count = [1, 2, 3, 4, 5]
#sensors = ['28-000005c6ba08', '28-000005c70f69', '28-000005c80eb9']
sensors = ['28-000005c6ba08']
def read_temp_raw():
catdata = subprocess.Popen(['cat',device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out,err = catdata.communicate()
out_decode = out.decode('utf-8')
lines = out_decode.split('\n')
return lines
def read_temp():
lines = read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
temp_f = temp_c * 9.0 / 5.0 + 32.0
return temp_f
##############################################
########### build window ###################
##############################################
class App(threading.Thread):
def _init_(self):
threading.Thread._init_(self)
self.start()
def callback(self):
self.root.quit()
def run(self):
self.root = Tk() #Makes the window
self.root.wm_title("Temperature Monitor")
self.root.minsize(200,100)
leftFrame = Frame(self.root, width=200, height = 600)
leftFrame.grid(row=0, column=0, padx=10, pady=2)
Label(leftFrame, text="Equipment").grid(row=0, column=0, padx=10, pady=2)
self.equipTemp = StringVar()
Label(leftFrame, textvariable=self.equipTemp, width=8, justify=RIGHT).grid(row=5, column=0, padx=10, pady=2)
Label(leftFrame, text="deg F").grid(row=5, column=1, padx=10, pady=2)
self.root.mainloop() #start monitoring and updating the GUI
##############################################
########### Start Loop ###################
##############################################
print "starting app"
app = App()
app.start()
print "app started"
###########################################################
################### Begin ds18b20 function ##############
###########################################################
while True:
for i in sensors:
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + i)[0]
device_file = device_folder + '/w1_slave'
#print i, (read_temp())
##################################################
##################### END ds18b20 Function ######
##################################################
app.equipTemp.set(round(read_temp(),1))
# Wait 30 seconds before continuing
time.sleep(5)
1 ответ
Если это происходит периодически, это звучит как классическое состояние гонки. Код, который пытается получить доступ к переменной, выполняется до ее установки.
Tkinter не является потокобезопасным. Хотя я не знаю с абсолютной уверенностью, что вы не можете получить доступ к IntVar в отдельном потоке, весьма вероятно, что вы не сможете.
Поскольку вы только читаете (короткие?) Текстовые файлы (или устройства, подобные текстовым файлам), я не уверен, что вам нужно использовать многопоточность. Предполагая, что вы можете прочитать любой отдельный файл датчика, скажем, за 100 мс или меньше, вам вообще не нужна многопоточность. Просто используйте after
периодически вызывать функцию для чтения данных датчика.