一种选择是使用ipywidgets,这是一个专门为 Jupyter Notebook/Labs 提供表单小部件的 Python 库。
显示Checkbox:
from ipywidgets import Checkbox
mycheckbox = Checkbox()
display(mycheckbox)
这将显示一个复选框,您可以选中和取消选中它。但是,复选框的状态不会被保存。每次重新运行 notebook 或重新启动内核时,都会使用其默认值 (False) 重新创建复选框。
如果您希望使用保存的值创建复选框,那么您需要获取该值并在创建复选框时将其传递。
mycheckbox = Checkbox(value=myvalue)
但是,当然,您需要先检索该值。您还需要在值更改时保存该值,以便下次可以检索它。对于下面的示例,我使用 JSON 文件来存储值。当然,该示例可以适用于使用任何有效的方法来存储持久性数据。
假设我们有一个名为 data.json 的文件,其中包含以下内容:
{"item": true}
然后,在我们的笔记本中,我们运行以下 Python 代码:
from ipywidgets import Checkbox
import json
with open('data.json', 'r') as f:
data = json.load(f)
item = Checkbox(value=data['item'], description='item')
def on_value_change(change):
key = change['owner'].description
value = change['new']
data[key] = value
with open('data.json', 'w') as f:
json.dump(data, f)
item.observe(on_value_change, names='value')
display(item)
让我们分解一下。
首先我们将 JSON 数据加载到 Python 中dict:data。
with open('data.json', 'r') as f:
data = json.load(f)
然后我们使用从 JSON 文件中获得的值创建复选框。
item = Checkbox(value=data['item'], description='item')
但我们还需要检测复选框的任何更改。所以我们需要定义一个变更处理程序。
def on_value_change(change):
key = change['owner'].description
value = change['new']
data[key] = value
with open('data.json', 'w') as f:
json.dump(data, f)
前两行获取项目的名称和新值。然后我们用新值更新data。最后,我们将更新后的data 写入我们的 JSON 文件。
最后,我们需要通过将处理程序传递给observe 方法来告诉复选框:
item.observe(on_value_change, names='value')
请注意,我们将names='value' 传递给observe,以便只接收对值的更改(其他任何内容都将被忽略)。
以下是一个稍作修改的版本,每次更新数据文件时都会打印输出通知您:
from ipywidgets import Checkbox, Output
import json
with open('data.txt', 'r') as f:
data = json.load(f)
item = Checkbox(value=data['item'], description='item')
out = Output()
@out.capture()
def on_value_change(change):
key = change['owner'].description
value = change['new']
print(f'Saving value: "{{ \'{key}\': {value} }}"')
data[key] = value
with open('data.txt', 'w') as f:
json.dump(data, f)
item.observe(on_value_change, names='value')
display(item)
display(out)
运行它,每次单击复选框时,都会在其下方打印一条消息,显示已保存的内容。
Saving value: "{ 'item': False }"
Saving value: "{ 'item': True }"
Saving value: "{ 'item': False }"
它可以用于调试目的。通过添加更多print 语句,您可以确定change 变量中包含哪些其他信息。这可能有助于调整它以满足您的需求。