2015-05-12 5 views
-1

У меня есть малина Pi 2, и я пытаюсь создать графический интерфейс для управления светодиодом. Я нашел решение для этого, и он работает нормально до сих пор. Я делаю это с Python и Tkinter (я довольно новичок в обоих).Python tkinter и малина Pi аппаратная кнопка

Однако я подключил аппаратную кнопку к малине, но до сих пор я не могу заставить аппаратную кнопку и GIU работать вместе. Вот то, что у меня есть - окно с двумя кнопками - включите светодиод On и Quit (ясно, что это делает). Когда я нажимаю кнопку «Включить светодиод», он загорается светодиодом на макете, а текст кнопки изменяется на «Отключение светодиода», а когда я нажимаю его снова, он выключает светодиод и снова меняет текст кнопки. Какова роль аппаратной кнопки - когда я ее нажимаю - если светодиод выключен, он должен включить его и изменить текст кнопки, и если светодиод горит - при нажатии аппаратная кнопка должна выключить светодиод и изменить текст кнопки снова.

Я проверил другие сообщения, и я попробовал метод after, и кнопка аппаратного обеспечения работает, но когда я нажимаю первую кнопку - приложение замерзает. Вот код, который у меня есть до сих пор:

#! /usr/bin/python 

from tkinter import * 
import RPi. GPIO as GPIO 

GPIO.setwarnings(False) 

GPIO.setmode(GPIO.BCM) 

GPIO.setup(17, GPIO.OUT) 

GPIO.output(17, GPIO.LOW) 

GPIO.setup(10, GPIO.IN) 


def buttonp(): 
     while True: 
       if GPIO.input(10) == False: 
         if (GPIO.input(17) == True): 
           GPIO.output(17, GPIO.LOW) 
           ledButton["text"] = "Turn LED On" 
         else: 
           GPIO.output(17, GPIO.HIGH) 
           ledButton["text"] = "Turn LED Off" 
     root.after(2000, buttonp) 

def toggle(): 

if GPIO.input(17): 
GPIO.output(17, GPIO.LOW) 
ledButton["text"] = "Turn LED On" 
else: 
GPIO.output(17, GPIO.HIGH) 
ledButton["text"] = "Turn LED Off" 

def quit(): 
     GPIO.output(17, GPIO.LOW) 
     exit() 



root = Tk() 

root.title("LED Controler") 
root.minsize(width = 800, height = 600) 
ledButton = Button(root, text = "Turn LED on", command = toggle) 
ledButton.pack(side = LEFT) 

quitButton = Button(root, text = "Quit", command = quit) 
quitButton.pack(side = LEFT) 

root.after(2000, buttonp) 
root.mainloop() 

Было бы признательно, если бы кто-то мог мне помочь в этом.

С уважением,

Иван

+0

Это зависает, потому что у вас бесконечный цикл. Ваш цикл while никогда не заканчивается и, похоже, даже не пытается прекратить действие. –

+0

Ну, есть ли способ проверить, нажата ли аппаратная кнопка без использования цикла? Мне все еще нужен GUI, хотя .... – Ivan

+0

Да. Это то же самое, как если бы вы делали анимацию. Напишите функцию, которая выполняет проверку, а затем используйте метод tkinter 'after' для регулярного вызова этой функции. Базовый шаблон описан здесь: http://stackoverflow.com/a/11505034/7432. Независимо от того, рисуете ли вы кадр анимации или опрос устройства, шаблон тот же. –

ответ

0

Возможно добавить "root.update()" в свой цикл.

+0

Спасибо всем за вашу помощь. Теперь он отлично работает! – Ivan

Смежные вопросы