2016-11-05 7 views
0

こんにちは皆、私はパイソンとそのモジュールの初心者です。だから、私はオフィスライトシステムを監視するためのアプリを開発しています。私はGUIを開発するためにtkinterを使用しています、私はbuttom comandの中でループを実行しようとすると、私のguiをフリーズします。だから私はモジュールを踏んでいくことについてちょっと読んだ。 変数varから返された値をループ内で使用したいのですが。私は以下のようにしようとしますが、関数 'enable_automatico'はスレッド関数 'acionamento_automatico'を呼び出しません。私はラズベリーパイ、チキンとスレッディング

#!/usr/bin/python3 
# Importando os pacotes 
import sys 
import time 
import threading 
import RPi.GPIO as GPIO 
from tkinter import ttk 
from tkinter import* 
import tkinter as tk 
from tkinter import messagebox 


#Configurando a 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 A Vendas 
GPIO.setup(27, GPIO.OUT)#Luminária B Vendas 
GPIO.setup(22, GPIO.OUT)#Luminária A Engenharia 
GPIO.setup(5, GPIO.OUT) #Luminária B Engenharia 
GPIO.setup(6, GPIO.OUT) #Luminária A Compras 
GPIO.setup(13, GPIO.OUT)#Luminária B Compras 
GPIO.setup(19, GPIO.OUT)#Luminária A 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 A Vendas 
GPIO.output(27, GPIO.LOW)#Luminária B Vendas 
GPIO.output(22, GPIO.LOW)#Luminária A Engenharia 
GPIO.output(5, GPIO.LOW) #Luminária B Engenharia 
GPIO.output(6, GPIO.LOW) #Luminária A Compras 
GPIO.output(13, GPIO.LOW)#Luminária B Compras 
GPIO.output(19, GPIO.LOW)#Luminária A 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) and (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) and (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) and (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) and (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() 
+0

のようにGUIで動作する必要があるかもしれない 'root.after(ミリ秒、FUNCTION_NAME)'定期的に関数を実行しないために、あなたは何のあなたのループやスレッドが必要になりますを使用します。 – furas

+0

私の場合、 'acionamento_automatico'は' Thread'クラスの一部ではないので、 'enable_automatico'は起動できません。あなたは 'run()'という名前を使わなければなりません。 – furas

+0

私はこのアプリでもっとスレッドを持っています。自分のコードにスレッドを使用していますか?私はかなり失われています... – armf1993

答えて

0

スレッドがその機能run()にあるコードを実行されますが、あなたはそれを

from threading import Thread 
import time 

# ----- 

def my_function(name, counter): 
    for 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() 

を持っていないか、またはあなたはそれを短い

from threading import Thread 
import time 

# ----- 

def my_function(name, counter): 
    for x in range(counter): 
     print(name, x) 
     time.sleep(0.5) 

# ----- 

thread = Thread(target=my_function, args=("World", 10)) 
thread.start() 
を行うことができます>すべてのエラーを得ることはありません

EDIT: exどのようにスレッドを制御し、それを停止する十分な。

ところで:状況によっては、queueを使用してスレッドと通信する必要があります。メインスレッドだけがprint()を使用してtkinter

from threading import Thread 
import time 

# ----- 

def my_function(name, counter): 
    for 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 
+0

Furasありがとうございます。それは私のスレッドがtkinterのメインループにないというエラーを受け取るだけです。この例外をどうすれば処理できますか? – armf1993

+0

このエグゼクティブを表示する - 全文を表示する。スレッドは 'root.mainloop()'の前に作成/開始する必要があります。 BTW:あなたのコードに 'mainloop()'は表示されません - tkinterはそれなしでは実行できません( 'tkinter'を使用し、' mainloop() 'を実行するIDLEで実行する場合を除く)。 'tkinter'ウィンドウを閉じる前にスレッドを止めなければなりません。スレッドはウィンドウを閉じるときに削除されるtkinter要素を使用しようとします。 – furas

+0

凡例、それを得てそれを修正します。ありがとうございました!! – armf1993

関連する問題