【问题标题】:Markdown clickable checkboxMarkdown 可点击复选框
【发布时间】:2021-03-26 19:01:54
【问题描述】:

在 Markdown 中使用<input type="checkbox"/> - [ ] 会出现一个白框,不能通过点击检查。任何想法如何在那里实现进度文档的可点击复选框。我想我需要一个扩展,但它适用于 jupyterlab?

例子:

  • [ ] 做这个做那个然后做那个(这么长的tex)
  • [ ] 另一个长文本
  • [ ]点击记录你的进度,完成任务后放置,勾选不需要保存。

【问题讨论】:

    标签: html jupyter-notebook markdown jupyter-lab


    【解决方案1】:

    - [ ] 为您提供空复选框,- [x] 将呈现为选中的复选框。 这是 GitHub 风格的演示:

    - [ ] unchecked
    - [x] checked
    

    将呈现为:

    请注意,HTML 单选按钮和复选框等内容虽然是交互式的,但并不是对文档的永久更改,除非您有后端代码通过更改 HTML 标记来保存更改。

    看这个:

    label {
      padding-left: 5px;
    }
    
    input {
      float: left;
    }
    <div>
      <input type="checkbox" name="uchk">
      <label for="uchk">Unchecked.</label>
    </div>
    <div>
      <input type="checkbox" name="chk" checked>
      <label for="chk">Checked.</label>
    </div>

    此外,我不认为你真的希望你的 Markdown 文档有可点击的复选框,它会减少沉浸感,而且如果它们是永久性的,任何人都可以轻松更改它。

    【讨论】:

    • 我知道手动输入 x 可以检查它们,但我真的需要通过单击以交互方式检查它们,以便用户没有看到原始 Markdown 代码。我知道在 HTML 代码中可以有复选框,但我需要将它放在 Jupterlab 中执行的降价单元格中,您和我的示例无法通过单击激活
    • @user23657 我不认为这是可以实现的。我建议为此将您的项目转换为网页,因为即使您确实完成了此操作,它也很可能是一种 hacky 方式并且无法真正维护。如果您找到解决方案,请继续跟进。我已经为你的问题添加了书签。由于您使用的是 python,因此您可能需要检查 flask 或 django 作为您的后端解决方案。
    【解决方案2】:

    一种选择是使用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 变量中包含哪些其他信息。这可能有助于调整它以满足您的需求。

    【讨论】:

    • 感谢您的详细回答。对我来说没问题,这些值通常不会被保存,但使用 json 是一个很好的解决方法。我更希望在降价单元格中有复选框,因为会有很多文本,然后用户将看不到任何代码,有没有办法在那里集成小部件或任何扩展?
    • Markdown 单元格呈现为 HTML。你基本上可以在 JavaScript 中做同样的事情来保存复选框的状态
    • 好的,即使我将它放在代码单元格中,标签的长度也是有限的,所以如果我需要复选框旁边的更长文本,它将不会完全显示,有没有解决方案?
    • 使用解决方法here 我无法拥有多行文本,插入 \n 也无济于事
    【解决方案3】:

    您可以改为整合 HTML &lt;input type="radio"/&gt;,并将样式更改为类似于复选框。

    【讨论】:

    • 据我所知,收音机只能一次选择一件事。此外,我遇到了同样的问题,即点击没有激活它
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多