连续的ipywidgets按钮

3

我试图使用ipywidgets按钮创建一系列连续的按钮点击过程。

点击按钮1应该清除按钮1并显示按钮2等等...

看起来引入wait变量使我的清除函数(purge function)无法到达,我不明白为什么。

from ipywidgets import Button
from IPython.display import display, clear_output

def purge(sender):
    print('purge')
    clear_output()
    wait=False

for i in range(5):
    print(f'Button number :{i}')
    btn = widgets.Button(description=f'Done', disabled=False,
                        button_style='success', icon='check')
    btn.on_click(purge)
    display(btn)
    wait=True
    while wait:
        pass
2个回答

1
你的 while wait: pass 循环是一个非常紧密的循环,可能会占用 CPU 核心达到 100%。这不仅会拖慢你的程序,甚至可能会拖慢整个计算机。
我认为你想要做的是在 on_click 回调函数中显示下一个按钮,而不是在 for 循环中。
from ipywidgets import Button
from IPython.display import display, clear_output

def purge(i):
    print(f'Button number :{i}')
    clear_output()
    btn = widgets.Button(description=f'Done', disabled=False,
                        button_style='success', icon='check')
    btn.on_click(purge, i + 1)
    display(btn)

purge(1)

然后你可以在函数中放置一个 if i == 5,当他们到达最后一个按钮时执行其他操作。

谢谢你的回答,我认为你解决了部分问题,但按钮仍然被阻止。清除函数没有被调用。从逻辑上看,代码看起来很准确,所以我认为错误与我的ipywidgets库的使用有关。 - Xavier M.

0

虽然可能不是最干净的,但这是我的解决方案。

按钮和其他ipywidgets的属性是动态可修改的:

import ipywidgets as widgets
from IPython.display import display
from IPython.display import clear_output

# Create and display button
button = widgets.Button(description="Begin")
output = widgets.Output()
display(button, output)

# Initialize variable
i = 0

def update_button(args):
    global i  # Declare i as a global variable
    with output:
        print("Button %s clicked." % i)
       
        # Button attributes' change conditions
        if i<2:
            button.description = 'Next'
        else:
            button.description = 'Done'
            button.button_style='success'
            button.icon='check'
        
        # Do something different on each button press
        if i == 0:
            # Do stuff
            print('Doing stuff')
        elif i == 1:
            # Do other stuff
            print('Doing other stuff')
        elif i ==2:
            # Do some other stuff
            print('Doing some other stuff and finishing')
        i=i+1
        clear_output(wait=True)

button.on_click(update_button)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接