基于一个答案,其他地方,我现在设法在木星中创建了一个下降。在一个选择的变化,我想要一个选择相关的熊猫DataFrame被显示。这通常是可行的,只是一旦选择了一个新值(从下拉列表中),已经显示的DataFrame就不会被清除:输出(DataFrames)最终会堆叠在Output
小部件的另一个上面。我确实使用clear_output
,但它似乎没有帮助。
下面是演示该问题的完整的最小片段:
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']}
来说,情况也是一样的--它们也会堆积起来,而不是“先前选择的消失,新选择的出现”。
发布于 2022-07-27 20:21:34
使用out.outputs = []
而不是clear_output()
的选项
基于https://stackoverflow.com/a/64103274/8508004。
# 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)
的使用似乎受到了尊重。
# 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)
https://stackoverflow.com/questions/73136715
复制相似问题