WARNING streamlit.runtime.scriptrunner_utils.script_run_context: Thread 'MainThread': missing ScriptRunContext
时间: 2024-10-24 09:17:34 浏览: 111
在SoundDevice库中,当你试图通过`st.info()`在非主线程(如录音线程)中更新Streamlit信息时,会遇到`ScriptRunContext`缺失的警告。这是因为`st.info()`通常是在主线程中调用的,以保证与UI的交互。解决这个问题的方法是确保在主线程中更新状态,或者使用异步机制。
当需要停止录音线程时,由于`sd.stop()`应该在一个可以捕获异常的地方执行,以防止影响整个程序,你不能简单地在`try- 使用全局变量`stop_or_rec`来标记是否应停止录音。
```python
if stop_or_rec_confirm and stop_or_rec: # 确保在主线程中修改这个全局变量
with mutex: # 使用锁确保同步操作
sd.stop()
stop_or_rec = False # 设置为False以避免重复尝试停止
st.info("正在停止录音") # 在主线程中安全地更新状态
```
2. **处理录音完成后的回调**:
- 当录音结束后,在主线程中处理音频文件的保存逻辑,而不是在`except`块中。
```python
def on_recording_done():
try:
audio_data[:] = [item for item in audio_data if not isinstance(item, bool)]
combined_array = np.vstack(audio_data)
sf.write(filename, combined_array, fs, subtype='PCM_16')
st.success("录音完成!已保存为 {}".format(filename))
except:
st.error("保存出错")
finally:
mutex.release()
if stop_or_rec_confirm:
sd.recorder.callback = on_recording_done # 设置录音完成后触发回调
# 如果你想立即停止并保存,可以在on_recording_done内部检查stop_or_rec
```
这样,你可以确保在适当的时候更新UI,并在录音线程完成后安全地处理音频数据。请注意,为了完全避免`ScriptRunContext`警告,你可能还需要确保其他跨线程的操作都在合适的地方执行。
阅读全文