连续的 ipywidgets 按钮

Successive ipywidgets buttons

我正在尝试使用 ipywidgets 按钮进行连续的按钮点击过程。

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

看来wait变量的引入让我的purge函数无法访问,我不明白为什么。

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

您的 while wait: pass 循环是一个非常紧密的循环,可能会以 100% 的速度旋转 CPU 核心。这不仅会使您的程序陷入困境,甚至可能使您的整个计算机陷入困境。

我想你要做的是不在 for 循环中显示下一个按钮,而是在 on_click 回调中。

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 的属性是可动态修改的:

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)