Hello!I am trying to build a basic streamlit dashboard style web app which will display and update live data from a stream. I am using the KiteConnect api for fetching stock prices each second and updating the app. I am getting the following Error Message when I run my streamlit app code:
Unhandled Error
Traceback (most recent call last):
File "C:\Python\lib\site-packages\twisted\internet\base.py", line 498, in fireEvent
DeferredList(beforeResults).addCallback(self._continueFiring)
File "C:\Python\lib\site-packages\twisted\internet\defer.py", line 497, in addCallback
return self.addCallbacks(callback, callbackArgs=args, callbackKeywords=kwargs)
File "C:\Python\lib\site-packages\twisted\internet\defer.py", line 477, in addCallbacks
self._runCallbacks()
File "C:\Python\lib\site-packages\twisted\internet\defer.py", line 857, in _runCallbacks
current.result = callback( # type: ignore[misc]
--- <exception caught here> ---
File "C:\Python\lib\site-packages\twisted\internet\base.py", line 510, in _continueFiring
callable(*args, **kwargs)
File "C:\Python\lib\site-packages\twisted\internet\base.py", line 1311, in _reallyStartRunning
self._handleSignals()
File "C:\Python\lib\site-packages\twisted\internet\posixbase.py", line 338, in _handleSignals
_SignalReactorMixin._handleSignals(self)
File "C:\Python\lib\site-packages\twisted\internet\base.py", line 1279, in _handleSignals
signal.signal(signal.SIGTERM, reactorBaseSelf.sigTerm)
File "C:\Python\lib\signal.py", line 47, in signal
handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
builtins.ValueError: signal only works in main thread of the main interpreter
Following is the section of code which subscribes to the live stream and updates the web app components:
with open('api_config.txt','r') as f:
info=json.load(f)
# Initialise
kws = KiteTicker(info['api_key'], info['access_token'])
# Assign the callbacks.
kws.on_ticks = on_ticks
kws.on_connect = on_connect
kws.on_close = on_close
# Infinite loop on the main thread. Nothing after this will run.
# You have to use the pre-defined callbacks to manage subscriptions.
kws.connect()
def on_ticks(ws, ticks):
# Callback to receive ticks.
#logging.debug("Ticks: {}".format(ticks))
# 0 VIX 264969
# 1 NIFTY 50 256265
#Updating variables with values obtained from feed
#vix_open,vix_high,vix_low,vix_close,vix_pclose,vix_perchange,nif_ochange
#Replacing components in every iteration
with placeholder.container():
k_vix_open,k_vix_high,k_vix_low,k_vix_close,k_vix_pclose,k_vix_perchange,k_nif_ochange=st.columns(7)
k_vix_open.metric(
label='Open',
value=vix_open,
delta=np.sign(vix_open)
)
k_vix_high.metric(
label='High',
value=vix_high,
delta=np.sign(vix_high)
)
k_vix_low.metric(
label='Low',
value=vix_low,
delta=np.sign(vix_low)
)
k_vix_close.metric(
label='Close',
value=vix_close,
delta=np.sign(vix_close)
)
k_vix_pclose.metric(
label='Close',
value=vix_pclose,
delta=np.sign(vix_pclose)
)
k_vix_perchange.metric(
label='% Change VIX',
value=vix_perchange,
delta=np.sign(vix_perchange)
)
k_nif_ochange.metric(
label='% Overnight Change Nifty',
value=nif_ochange,
delta=np.sign(nif_ochange)
)
I would appreciate any inputs for this. Thank you!