Я работаю над созданием автоматизированной оранжереи, измеряя температуру, есть вещи, которые нужно активировать, например, открыть окно или управлять вентилятором в соответствии с изменением стоимости в Я сделал эту программу на python, используя tkinter, поэтому, когда условия else, elif, если они находятся внутри функции def, они отправляют отпечатки, но когда я запускаю свой код даже при изменении температуры значения, я отправляю это значение температуры в другую функцию def для их использовать, поэтому они, кажется, всегда используют первое, если и игнорируют остальные условия. Я пробовал отлаживать, но когда я работаю над Geany в Beaglebone, я не могу найти вариант.отправка переменной переменной в функцию def потоком
#!/usr/bin/python2.7
import thread
import Tkinter as tk
from time import sleep
import Adafruit_BBIO.PWM as PWM
import Adafruit_BBIO.GPIO as GPIO
import Adafruit_BBIO.ADC as ADC
#PWM.start(channel,duty,freq=1000,polarity=0)
#values for duty are from 0.0 to 100.0 (%)
PWM.start("P8_13",0,50)
GPIO.setup("P8_15",GPIO.OUT)
GPIO.output("P8_15",GPIO.LOW)
GPIO.setup("P8_16",GPIO.OUT)
GPIO.output("P8_16",GPIO.LOW)
PWM.start("P9_14",0,50)
ADC.setup()
def med_temp(close):
adclose=close
while adclose < 1:
raw=ADC.read('P9_33')*1800
t=raw/10
temp1=round(t,0)
tempvar.set(temp1)
sleep(1)
def window_thread(close, value):
gpioclose1=close
temp=value
while gpioclose1<1:
if temp>=30.0 :
#print temp
duty=90
PWM.set_duty_cycle("P9_14",duty)
sleep(.1)
windvar.set('OPEN',)
label11["fg"]='green'
else:
duty=0
PWM.set_duty_cycle("P9_14",duty)
sleep(.1)
windvar.set('CLOSE')
label11["fg"]='red'
def fan1_thread(close,value):
gpioclose=close
temp=value
while gpioclose<1:
if temp<=23.0:
#out
GPIO.output("P8_15", GPIO.LOW)#OUT
GPIO.output("P8_16", GPIO.HIGH)
sleep(.1)
ventvar.set('OUT ')
label6["fg"]='#6c132b'
elif temp>=40.0:
#in
GPIO.output("P8_15", GPIO.HIGH)#IN
GPIO.output("P8_16", GPIO.LOW)
sleep(.1)
ventvar.set('IN ')
label6["fg"]='#5cbdea'
else:
#off
GPIO.output("P8_15", GPIO.LOW)#OFF
GPIO.output("P8_16", GPIO.LOW)
sleep(.1)
ventvar.set('OFF ')
label6["fg"]='red'
def fan2_thread(close,value):
pwmclose=close
temp=value
while pwmclose<1:
if temp<23.0:
duty=100
PWM.set_duty_cycle("P8_13",duty)
sleep(.1)
dutyvar.set(duty)
elif temp<25.0 and temp>=23.0:
duty=50
PWM.set_duty_cycle("P8_13",duty)
sleep(.1)
dutyvar.set(duty)
elif temp>=40.0:
duty=100
PWM.set_duty_cycle("P8_13",duty)
sleep(.1)
dutyvar.set(duty)
else:
duty=0
PWM.set_duty_cycle("P8_13",duty)
sleep(.1)
dutyvar.set(duty)
def salir():
pwmclose = 1
adclose =1
gpioclose =1
gpioclose1=1
PWM.stop("P8_13")
PWM.cleanup()
GPIO.cleanup()
exit()
mainw = tk.Tk()
mainw.title("Greenhouse control")
#contenido
tempvar = tk.DoubleVar()
ventvar = tk.StringVar()
dutyvar = tk.DoubleVar()
windvar = tk.StringVar()
label1 = tk.Label(mainw,text=' Temperature: ', width=len(' Temperature: '),bg='red')
label2 = tk.Label(mainw, textvariable=tempvar, bg='white')
label3 = tk.Label(mainw, text='C', width=len('C'), bg='white')
label4 = tk.Label(mainw, text=' FAN ', width=len(' FAN '),bg='purple')
label5 = tk.Label(mainw, text='Estado: ',width=len('Estate: '))
label6 = tk.Label(mainw, textvariable=ventvar,bg='white')
slider = tk.Scale(mainw, variable = dutyvar,from_=100, to=0)#
label9 = tk.Label(mainw, text=' WINDOW ', width=len(' WINDOW '), bg='purple')
label10 = tk.Label(mainw, text='Estate: ',width=len('State: '))
label11 = tk.Label(mainw, textvariable=windvar, bg='white')
thread.start_new_thread(window_thread,(0,tempvar,))
thread.start_new_thread(med_temp, (0,))
thread.start_new_thread(fan1_thread, (0,tempvar,))
thread.start_new_thread(fan2_thread, (0,tempvar,))
salirButton = tk.Button(mainw, text='EXIT', command=salir,activeforeground='red')
#set layout
label2.grid(row=0, column=1)
label1.grid(row=0, column=0)
label3.grid(row=0, column=2)
label4.grid(row=1,column=0, columnspan=4)
label5.grid(row=2, column=0)
label6.grid(row=2, column=1)
slider.grid(row=2, column=2, columnspan=2)
label9.grid(row=3, column=0, columnspan=4)
label10.grid(row=4, column=0)
label11.grid(row=4, column=1)
salirButton.grid(row=5, column=0, columnspan=4)
mainw.mainloop()
Так что я пошел и отправлю печатать температуру внутри if, и я получаю PY_VARO. В этой строке thread.start_new_thread (window_thread, (0, tempvar,)) Я отправляю в def функцию 0, чтобы закрыть функцию, и я отправляю tempvar, который является двойным. И если я пишу thread.start_new_thread (window_thread, (0, tempvar.get))
я получаю в темп печати внутри, если: связанного метода DoubleVar.get из Tkinter.DoubleVar
ПОЭТОМУ Я думаю, если условия не игнорируются, но я посылаю неправильное значение def, когда я начинаю поток? Какой правильный формат отправить его функции?
Я думаю, у вас есть опечатки temp = valor (value). Кроме того, функции никогда не выходят, т. Е. Выполняются только при первом запуске, потому что переменная while не изменяется, то есть «while adclose <1», addclose никогда не изменяется, поэтому цикл while() никогда не выходит. Время для упрощения программы и тестирования каждой функции отдельно, без потоков при тестировании. –
Я получаю PY_VARO - Tkinter's StringVar() и все используют методы get и set для доступа к значениям. Страница Effbot иллюстрирует метод set() http://effbot.org/tkinterbook/variable.htm –
Tkinter и потоки не смешиваются и их следует избегать. Вместо этого посмотрите на метод 'after': http://effbot.org/tkinterbook/widget.htm – ebarr