Oct-21-2021, 01:03 PM
Thanks deanhystad for the extensive help, greatly appreciated. After seeing my code re-written, I need to study this for sure. I added some of the items I thought would be needed and ran the code I posted here. I had to clean up some lines that had syntax errors, so I hope I did that correctly. Now when I run the code, I get no errors but the code just ends without doing anything.
#!/usr/bin/env python3 import enum import time import tkinter as tk import tkinter.ttk as ttk import RPi.GPIO as GPIO from tkinter import * GPIO.setmode(GPIO.BCM) GPIO.setup(5, GPIO.IN) GPIO.setup(6, GPIO.IN) now = time.strftime("%H:%M:%S") class TestState(enum.Enum): '''States for testing state machine''' Unknown = 0, # Figure out what the new state should be NotReady = 1, # Need to enter badge number before testing Ready = 2, # Badge entered. Waiting for test button press Testing = 3, # Running test. Completed = 4 # Test completed. Wait for test button release class App(Frame): def __init__(self,master=None): self.tester = '' self.time = '' self.label.configure('Test Not Ready') self.set_state(TestState.Unknown) self.update_clock() def set_state(self, new_state): '''Testing state machine. See states above''' if new_state == TestState.NotReady: # Report we are not ready for testing self.label.configure('Test Not Ready') if new_state == TestState.Ready: # Report we are ready for testing self.label.configure('Test Ready') if new_state == TestState.Testing: # Perform the test and report results result = ('FAILED', 'PASSED')[GPIO.input(6)] self.label.configure(f="blah Test" + {result}) with open(self.test_file, "a") as f: # open file f.write(f='Badge#' + {self.test}) # Erase test results after 4 seconds self.after(4000, lambda: self.set_state(TestState.Completed)) self.state = new_state def update_clock(self): '''Runs periodically''' self.tester = self.entry_widget.get() self.time = now if self.state == TestState.Unknown: if len(self.tester) == 0: self.set_state(TestState.NotReady) else: self.set_state(TestState.Ready) if self.state == TestState.NotReady: # Waiting for tester to enter badge number if len(self.tester) > 0: self.set_state(TestState.Ready) if self.state == TestState.Ready: # Waiting for test button. Can also go to not-ready if if len(self.tester) == 0: self.set_state(TestState.NotReady) elif GPIO.input(5) == 1: self.set_state(TestState.Testing) if self.state == TestState.Completed: # Begin new test sequence when test button is released if GPIO.input(5) == 0: self.set_state(TestState.Unknown) # Update frequently to be responsive to button press self.after(100, lambda: self.update_clock)