multithreading - Raspberry pi, tkinter and threading -
hi guys here, newbie on python , modules. so, developing app monitor office light system. using tkinter develop gui, try run loop within buttom comand , freezes gui. read little treading module. want use value returning variable var in loop. try can see below, function 'enable_automatico' don't call thread function 'acionamento_automatico'. don't error>
#!/usr/bin/python3 # importando os pacotes import sys import time import threading import rpi.gpio gpio tkinter import ttk tkinter import* import tkinter tk tkinter import messagebox #configurando i/o gpio.setmode(gpio.bcm) gpio.setwarnings(false) #configurando os pinos de entrada gpio.setup(18, gpio.in) #sensor de presença vendas gpio.setup(23, gpio.in) #sensor de luminosidade vendas gpio.setup(24, gpio.in) #sensor de presença engenharia gpio.setup(25, gpio.in) #sensor de luminosidade engenharia gpio.setup(12, gpio.in) #sensor de presença compras gpio.setup(16, gpio.in) #sensor de luminosidade compras gpio.setup(20, gpio.in) #sensor de presença marketing gpio.setup(21, gpio.in) #sensor de luminosidade marketing #configurando os pinos de saída gpio.setup(17, gpio.out)#luminária vendas gpio.setup(27, gpio.out)#luminária b vendas gpio.setup(22, gpio.out)#luminária engenharia gpio.setup(5, gpio.out) #luminária b engenharia gpio.setup(6, gpio.out) #luminária compras gpio.setup(13, gpio.out)#luminária b compras gpio.setup(19, gpio.out)#luminária marketing gpio.setup(26, gpio.out)#luminária b marketing #configurando os pinos de saída para o modo de operação manual gpio.output(17, gpio.low)#luminária vendas gpio.output(27, gpio.low)#luminária b vendas gpio.output(22, gpio.low)#luminária engenharia gpio.output(5, gpio.low) #luminária b engenharia gpio.output(6, gpio.low) #luminária compras gpio.output(13, gpio.low)#luminária b compras gpio.output(19, gpio.low)#luminária marketing gpio.output(26, gpio.low)#luminária b marketing #definição da fonte de texto large_font = ("verdana", 22) medium_font = ("verdana", 16) small_font = ("verdana", 12) #a class thread class mythread(threading.thread): def __init__(self, threadid, name, counter): threading.thread.__init__(self) self.threadid = threadid selfname = name self.counter=counter def acionamento_automatico(thread1, counter): while (app.frames[acionamento].var.get()==2): if ((gpio.input(18)==false) , (gpio.input(23)==false)): gpio.output(17, gpio.high) gpio.output(27, gpio.low) app.frames[acionamento].vendasframe.luminaria_esquerdaframev.label6.configure(text="ligado") app.frames[acionamento].vendasframe.luminaria_direitaframev.label7.configure(text="desligado") if ((gpio.input(18)==true) , (gpio.input(23)==false)): gpio.output(17, gpio.low) gpio.output(27, gpio.low) app.frames[acionamento].vendasframe.luminaria_esquerdaframev.label6["text"]="desligado" app.frames[acionamento].vendasframe.luminaria_direitaframev.label7["text"]="desligado" if ((gpio.input(18)==false) , (gpio.input(23)==true)): gpio.output(17, gpio.high) gpio.output(27, gpio.high) app.frames[acionamento].vendasframe.luminaria_esquerdaframev.label6["text"]="ligado" app.frames[acionamento].vendasframe.luminaria_direitaframev.label7["text"]="ligado" if ((gpio.input(18)==true) , (gpio.input(23)==false)): gpio.output(17, gpio.low) gpio.output(27, gpio.low) app.frames[acionamento].vendasframe.luminaria_esquerdaframev.label6["text"]="desligado" app.frames[acionamento].vendasframe.luminaria_direitaframev.label7["text"]="desligado" thread1.exit() #habilitar modo automático def enable_automatico(): automatico_message = messagebox.showinfo(title="modo automático", message = "o acionamento das luminárias será feito conforme luminosidade e pessoas no setor, resultando num menor consumo de energia") app.frames[acionamento].vendasframe.luminaria_esquerdaframev.lev_button.configure(state=disabled) app.frames[acionamento].vendasframe.luminaria_direitaframev.ldv_button.configure(state=disabled) app.frames[acionamento].engenhariaframe.luminaria_esquerdaframee.lee_button.configure(state=disabled) app.frames[acionamento].engenhariaframe.luminaria_direitaframee.lde_button.configure(state=disabled) app.frames[acionamento].comprasframe.luminaria_esquerdaframec.lec_button.configure(state=disabled) app.frames[acionamento].comprasframe.luminaria_direitaframec.ldc_button.configure(state=disabled) app.frames[acionamento].marketingframe.luminaria_esquerdaframem.lem_button.configure(state=disabled) app.frames[acionamento].marketingframe.luminaria_direitaframem.ldm_button.configure(state=disabled) app.frames[acionamento].vendasframe.luminaria_esquerdaframev.lev_button.update() app.frames[acionamento].vendasframe.luminaria_direitaframev.ldv_button.update() app.frames[acionamento].engenhariaframe.luminaria_esquerdaframee.lee_button.update() app.frames[acionamento].engenhariaframe.luminaria_direitaframee.lde_button.update() app.frames[acionamento].comprasframe.luminaria_esquerdaframec.lec_button.update() app.frames[acionamento].comprasframe.luminaria_direitaframec.ldc_button.update() app.frames[acionamento].marketingframe.luminaria_esquerdaframem.lem_button.update() app.frames[acionamento].marketingframe.luminaria_direitaframem.ldm_button.update() global thread1 thread1 = mythread(1, "thread-1", 1) thread1.start()
thread runs code in function run()
don't have it
from threading import thread import time # ----- def my_function(name, counter): x in range(counter): print(name, x) time.sleep(0.5) # ----- class mythread(thread): def run(self): my_function("hello", 10) # ----- thread = mythread() thread.start()
or can shorter
from threading import thread import time # ----- def my_function(name, counter): x in range(counter): print(name, x) time.sleep(0.5) # ----- thread = thread( target=my_function, args=("world", 10) ) thread.start()
edit: example how control thread , stop it.
btw: in situations should use queue
communicate thread. main thread should use print()
, works gui tkinter
from threading import thread import time # ----- def my_function(name, counter): x in range(counter): if stop: print('stop') break print(name, x) time.sleep(0.5) # ----- stop = false thread = thread( target=my_function, args=("world", 20) ) print("alive 0:", thread.is_alive()) # false thread.start() print("alive 1:", thread.is_alive()) # true time.sleep(2) print("alive 2:", thread.is_alive()) # true time.sleep(2) print("alive 3:", thread.is_alive()) # true stop = true print("alive 4:", thread.is_alive()) # true time.sleep(2) print("alive 5:", thread.is_alive()) # false # wait till thread ends thread.join() print("alive 5:", thread.is_alive()) # false
Comments
Post a Comment