使用 Jupyter 笔记本(我使用 Jupyter Lab 4 作为 IDE),我有一个无限循环,直到用户按下一个键,例如 Q 或 q,应用程序可以通过该键检查 键被按下并停止循环。不幸的是,所有键盘输入都被 Jupyter 笔记本中的系统拦截(键盘等模块不起作用)。 所以我被迫尝试tkinter、Qs5/6等GUI模块,然后研究了几天ipywidgets,最终因异步问题未解决而停止:按钮的on_click事件直到主循环结束,那就没用了;文档中有3个选项:https://ipywidgets.readthedocs.io/en/stable/examples/Widget%20Asynchronous.html,我尝试了第一个:事件循环集成,它不起作用(事件仍然没有触发),我很沮丧。 用笔记本进行无阻塞按键输入就这么难吗?非常感谢您的建议。 (请注意,输入功能是“阻塞”的,所以这不是问题)
我认为以下是最简单的解决方案之一。 (与异步、线程、多处理相比)
import ipywidgets as widgets
from jupyter_ui_poll import ui_events
import time
button = widgets.Button(description="STOP!")
output = widgets.Output()
display(button, output)
clicked = False
def on_button_clicked(b):
global clicked
clicked = True
with output:
print("button clicked")
print(f"debug1: clicked={clicked}")
button.on_click(on_button_clicked)
with ui_events() as poll:
while not clicked:
poll(10) # poll queued UI events including button
time.sleep(1) # wait for 1 second before checking again
print(f"debug2: clicked={clicked}")
print('python waited for the button click')