Python Forum
Tkinter Exit Code based on Entry Widget
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Tkinter Exit Code based on Entry Widget
#4
Based on these assumptions:

input 5 starts the test
input 6 determines if the test fails or passes

You could do something like this:
import enum

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.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 blah blah Test {result} blah blah')
            with open(self.test_file, "a") as f: # open file
                f.write(f"Badge#{self.teste}, Test {result} ON: {self.time}n')
            # 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 = some date-time string
        ...
        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)
This implements a "state machine" that has the states:
Unknown: Current state is not known
NotReady: Waiting for badge number to be entered
Ready: Badge number entered and waiting for test button
Testing: Performing a test
Completed: Test is finished

We transition from one state to another when events occur. The transitions are (Transiton: Event):
Unknown->NotReady: Badge number is not entered
Unknown->Ready: Badge number is entered
NotReady->Ready: Badge number is entered
Ready->NotReady: Badge number is not entered
Ready->Testing: Test button is pressed
Testing->Completed: Test finished and 4 seconds passed
Completed->Unknown: Automatic

When we transition to a new state we perform some actions. The actions are:
Ready: Update status label
NotReady: Update status label
Testing: Run test. Record results. Update status label. Schedule transition to Unknown after 4 seconds

Since actions are only performed when the state changes you don't have to worry about recording the same results multiple times for one test or writing the test results over the Test Ready message. Most of the time your software will be do nothing but wait for an event.
Reply


Messages In This Thread
RE: Tkinter Exit Code based on Entry Widget - by deanhystad - Oct-21-2021, 03:47 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  ValueError: could not convert string to float: '' fron Entry Widget russellm44 5 855 Mar-06-2024, 08:42 PM
Last Post: russellm44
  TKinter Widget Attribute and Method Quick Reference zunebuggy 3 921 Oct-15-2023, 05:49 PM
Last Post: zunebuggy
  [Tkinter] entry widget DPaul 5 1,605 Jul-28-2023, 02:31 PM
Last Post: deanhystad
  [Tkinter] The Text in the Label widget Tkinter cuts off the Long text in the view malmustafa 4 5,103 Jun-26-2022, 06:26 PM
Last Post: menator01
  Can't get tkinter button to change color based on changes in data dford 4 3,491 Feb-13-2022, 01:57 PM
Last Post: dford
  [Tkinter] Making entry global in tkinter with multiprocessing luckyingermany 2 2,365 Jan-21-2022, 03:46 PM
Last Post: deanhystad
  [Tkinter] Update variable using tkinter entry methon drSlump 6 5,295 Oct-15-2021, 08:01 AM
Last Post: drSlump
  Tkinter | entry output. Sap2ch 1 2,039 Sep-25-2021, 12:38 AM
Last Post: Yoriz
  auto-generate code for Entry box location snakes 1 1,927 May-07-2021, 08:30 PM
Last Post: Yoriz
  .get() from generated Entry widgets in tkinter snakes 4 4,302 May-03-2021, 11:26 PM
Last Post: snakes

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020