首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >木星输出小部件未清除

木星输出小部件未清除
EN

Stack Overflow用户
提问于 2022-07-27 10:58:51
回答 1查看 151关注 0票数 0

基于一个答案,其他地方,我现在设法在木星中创建了一个下降。在一个选择的变化,我想要一个选择相关的熊猫DataFrame被显示。这通常是可行的,只是一旦选择了一个新值(从下拉列表中),已经显示的DataFrame就不会被清除:输出(DataFrames)最终会堆叠在Output小部件的另一个上面。我确实使用clear_output,但它似乎没有帮助。

下面是演示该问题的完整的最小片段:

代码语言:javascript
复制
import pandas as pd
from IPython.display import display, clear_output
import ipywidgets as widgets

out = widgets.Output()

w = widgets.Dropdown(
    options=['','one', 'two', 'three', 'four', 'five'],
    value='',
    description='Select:',
)

def on_change(change):
    if change['type'] == 'change' and change['name'] == 'value':
        
        print("changed to %s" % change['new'])  # this gets logged correctly to the console

        df = pd.DataFrame([change['new']], columns=['Selected'])
        clear_output(wait=False)  # I would expect this to prevent the output DataFrames piling up
        out.append_display_data(df)

w.observe(on_change)

display(w, out)

任何帮助都非常感谢。

*编辑:ipywidgets版本为7.6.3

**编辑:这个问题根本与熊猫无关。比方说,对于一个试图输出的字典dd = {'Selected': change['new']}来说,情况也是一样的--它们也会堆积起来,而不是“先前选择的消失,新选择的出现”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-27 20:21:34

使用out.outputs = []而不是clear_output()的选项

基于https://stackoverflow.com/a/64103274/8508004

代码语言:javascript
复制
# based on use of https://stackoverflow.com/a/64103274/8508004
import pandas as pd
from IPython.display import display, clear_output
import ipywidgets as widgets

out = widgets.Output()

w = widgets.Dropdown(
    options=['','one', 'two', 'three', 'four', 'five'],
    value='',
    description='Select:',
)

def on_change(change):
    if change['type'] == 'change' and change['name'] == 'value':
        
        print("changed to %s" % change['new'])  # this gets logged correctly to the console

        df = pd.DataFrame([change['new']], columns=['Selected'])
        out.outputs = []  # instead of output.clear_output()
        out.append_display_data(df)

w.observe(on_change)

display(w, out)

另一种选择:

基于https://stackoverflow.com/a/53755012/8508004和避免append_display_data()。结合使用输出小部件作为上下文管理器,在out中发送要显示的内容。

您使用的是append_display_data(),所以它是附加的吗?即使它是被清除的,以输出方式显示出来。至少这是我的猜测。无论如何,append_display_data显然在文献资料中被列为buggy:

“请注意,append_display_data目前不能用于显示小部件。此问题跟踪此bug的状态。”

append_display_data()来说更糟糕的是杰森·格劳特在这里的评论

“不幸的是,小部件在ipywidgets 8.0之前无法与append_display_data一起工作。”

目前,最新版本为7.7.1。

无论如何,您不需要在这里追加,因为您只是想替换正在显示的内容。使用with out:可以将显示数据的输出发送到小部件显示中。在这种情况下,clear_output(wait=False)的使用似乎受到了尊重。

代码语言:javascript
复制
# based on https://stackoverflow.com/a/53755012/8508004 and avoiding `append_display_data()`
import pandas as pd
from IPython.display import display, clear_output
import ipywidgets as widgets

out = widgets.Output()

w = widgets.Dropdown(
    options=['','one', 'two', 'three', 'four', 'five'],
    value='',
    description='Select:',
)


def on_change(change):
    if change['type'] == 'change' and change['name'] == 'value':
        
        print("changed to %s" % change['new'])  # this gets logged correctly to the console

        df = pd.DataFrame([change['new']], columns=['Selected'])
        with out:
            clear_output(wait=False)
            display(df)

w.observe(on_change)

display(w, out)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73136715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档