I want to:
- Read from serial port (infinite loop)
- when "STOP" button pressed --> Stop reading and plot data
From How to kill a while loop with a keystroke? I have taken the example to interrupt using Keyboard Interrupt, This works, but i would like to use a button.
EXAMPLE WITH KEYBOARD INTERRUPT
weights = []
times = []
#open port
ser = serial.Serial('COM3', 9600)
try:
while True: # read infinite loop
#DO STUFF
line = ser.readline() # read a byte string
if line:
weight_ = float(line.decode()) # convert the byte string to a unicode string
time_ = time.time()
weights.append(weight_)
times.append(time_)
print (weight_)
#STOP it by keyboard interup and continue with program
except KeyboardInterrupt:
pass
#Continue with plotting
However I would like to do it with a displayed button (easier for people to use). I have tried making a button (in Jupiter Notebook) that when pressed break_cicle=False, but the loop doesn't break when button pressed:
#make a button for stopping the while loop
button = widgets.Button(description="STOP!") #STOP WHEN THIS BUTTON IS PRESSED
output = widgets.Output()
display(button, output)
break_cicle=True
def on_button_clicked(b):
with output:
break_cicle = False # Change break_cicle to False
print(break_cicle)
ser.close()
button.on_click(on_button_clicked)
ser = serial.Serial('COM3', 9600)
try:
while break_cicle:
print (break_cicle)
line = ser.readline() # read a byte string
if line:
weight_ = float(line.decode()) # convert the byte string to a unicode string
time_ = time.time()
weights.append(weight_)
times.append(time_)
print (weight_)
except :
pass
ser.close()
EXAMPLE WITH GLOBAL NOT WORKING
from IPython.display import display
import ipywidgets as widgets
button = widgets.Button(description="STOP!") #STOP WHEN THIS BUTTON IS PRESSED
output = widgets.Output()
display(button, output)
break_cicle=True
def on_button_clicked():
global break_cicle #added global
with output:
break_cicle = False # Change break_cicle to False
print ("Button pressed inside break_cicle", break_cicle)
button.on_click(on_button_clicked)
try:
while break_cicle:
print ("While loop break_cicle:", break_cicle)
time.sleep(1)
except :
pass
print ("done")
Despite me pressing the button a few times,from the following image you can see that it never prints "Button pressed inside break_cicle".