Программа RPI не работает при запуске с помощью кнопки GPIO - PullRequest
0 голосов
/ 06 июня 2019

Итак, я делаю простой спортивный семафор для отображения результатов и времени.Я использую TkInter для GUI и GPIO (физические кнопки), чтобы добавлять оценки, ставить паузу / сбрасывать оценки и т.д. ... Когда я запускаю таймер / программу с помощью кнопки GPIO, другие кнопки GPIO больше не работают, и я не могу понять, почему.Я не могу добавить оценки или поставить таймер на паузу ... Если я запускаю программу с помощью кнопки GUI, она работает нормально, и я могу добавлять оценки, ставить таймер на паузу с помощью других кнопок GUI.Вот код, и я думаю, что есть некоторая проблема с передачей «корня».Кроме того, когда нажата кнопка GPIO, она передает аргумент, поэтому мне пришлось использовать это «что-то» для функций, а когда вы нажимаете кнопку GUI, нечего передавать функциям.В общем, когда я нажимаю кнопку GUI для вызова start (), все работает, когда я начинаю с кнопки GPIO, добавление партитур и других кнопок GPIO не работают

import RPi.GPIO as GPIO
import Tkinter as tk
import time


GPIO.setmode(GPIO.BCM)

GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP) 


def fun_score1(smth):
    global score1
    score1 += 1
    label_team1['text'] = 'Team 1: ' + str(score1)

def fun_score2(smth):
    global score2
    score2 += 1
    label_team2['text'] = 'Team 2: ' + str(score2)

def start():
    global count_flag, count
    count_flag = True

    while True: 
        if count_flag == False:
            break
        # put the count value into the label
        label_time['text'] = str(count)
        # wait for 0.1 seconds
        time.sleep(0.1)
        # needed with time.sleep()
        root.update()
        # increase count
        count += 0.1

def stop(smth=1):
    global count_flag, count, score1, score2
    count_flag = False
    count = 0.0
    score1 = 0
    score2 = 0
    label_time['text'] = str(count)
    label_team1['text'] = 'Team 1: ' + str(score1)
    label_team2['text'] = 'Team 2: ' + str(score2)

def pause(smth=1):
    global count_flag
    count_flag = False

count = 0.0
score1 = 0
score2 = 0

root = tk.Tk()
# this will be a global flag
count_flag = True

# create needed widgets
label_time = tk.Label(root, text='0.0')
label_team1 = tk.Label(root, text='Team 1: ' + str(score1))
label_team2 = tk.Label(root, text='Team 2: ' + str(score2))

#btn_pause = tk.Button(root, text='Pause', command=pause)
btn_start = tk.Button(root, text='Start', command=start)
#btn_stop = tk.Button(root, text='Reset', command=stop)

btn_start.grid(row=1, column=0, padx=5, pady=5)
#btn_stop.grid(row=1, column=2, padx=5)
#btn_pause.grid(row=1, column=1, padx=5)

label_time.grid(row=0, column=0, columnspan=2)
label_team1.grid(row=2, column=0, padx=5, pady=5)
label_team2.grid(row=2, column=3, padx=5, pady=5)

GPIO.add_event_detect(22, GPIO.RISING, callback=start, bouncetime=300)
GPIO.add_event_detect(24, GPIO.RISING, callback=stop, bouncetime=300)
GPIO.add_event_detect(23, GPIO.RISING, callback=pause, bouncetime=300)
GPIO.add_event_detect(4, GPIO.RISING, callback=fun_score1, bouncetime=300)
GPIO.add_event_detect(17, GPIO.RISING, callback=fun_score2, bouncetime=300)


# start the event loop
root.mainloop()

Program GUI

...