如何使用 Jupyter 笔记本进行非阻塞按键输入循环?

问题描述 投票:0回答:1

使用 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,我尝试了第一个:事件循环集成,它不起作用(事件仍然没有触发),我很沮丧。 用笔记本进行无阻塞按键输入就这么难吗?非常感谢您的建议。 (请注意,输入功能是“阻塞”的,所以这不是问题)

python asynchronous jupyter-notebook keyboard
1个回答
0
投票

我认为以下是最简单的解决方案之一。 (与异步、线程、多处理相比)

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')
© www.soinside.com 2019 - 2024. All rights reserved.