Документация для этого очень громоздкая и требует много времени. Мне нужен простой базовый пример Hello World, чтобы извлечь простой текст из текстового поля.
from ipywidgets import interact, widgets
from IPython.display import display
dossier_number_widget = widgets.Text(
value='EP23210283',
placeholder='EP23210283',
description='Dossier Number:',
disabled=False,
continuous_update=True
)
display(dossier_number_widget)
def callback(wdgt):
print(wdgt) # it doesn't print
display(wdgt) # it doesn't display
print(wdgt.value) # it doesn't print
display(wdgt.value) # it doesn't display
dossier_number_widget.observe(callback, 'value')
Не работает, что я делаю не так?
Другие примеры здесь, в SO, упоминаются on_submit, но этот метод устарел.
Я пробовал с помощью кнопки, но безрезультатно, она просто не печатает результат
from ipywidgets import interact, widgets
from IPython.display import display
submit_button=widgets.Button(description='Submit',button_style='success')
dossier_number_widget = widgets.Text(
value='EP23210283',
placeholder='EP23210283',
description='Dossier Number:',
disabled=False,
continuous_update=False
)
def on_button_clicked(wdgt):
print(dossier_number_widget.value) # it doesn't print
display(dossier_number_widget.value) # it doesn't display
submit_button.on_click(on_button_clicked)
display(dossier_number_widget, submit_button)






Вот пример извлечения текста из текстового виджета и реагирования на него для предоставления обратной связи пользователю:
from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets
text_input = widgets.Text(
value = "",
description = "Enter text here:",
style = {"description_width": "initial"},
layout=widgets.Layout(width='70%'),
)
def f(x):
if "Hello World" in x:
return "WHAT YOU TYPED CONTAINS MY FAVORITE PHRASE! YOU DID IT!!"
elif x != '':
return (f"I see you typed: {x}. You haven't typed my favorite phrase yet.")
else:
return x
interact(f, x=text_input);
В основном он адаптирован из блока кода, которым я поделился здесь в ответ на «Форматирование виджетов Jupyter» и документации ipywidgets по Interaction().
Вы увидите, что это не основано на вашем примере, о котором вы заявили следующее: «Это не работает, что я делаю не так?». Обратите внимание, что ваш пост не включает в себя то, что вы ожидали, или то, как вы хотели что-то извлечь и сделать, что оставляет простор для воображения и затрудняет предоставление разумных ответов на основе предоставленного вами кода. Пожалуйста, прочитайте Как мне задать хороший вопрос? в следующий раз. Особенно разделы и ссылки в разделах «Соответствующие теме и подходящие» и «Помогите другим воспроизвести проблему».
Дополнительную помощь см.:
input() функции Python, предназначенной для консоли/интерпретаторов. (Кроме того, в этом посте я ссылаюсь на суть, в которой есть версия кода с кнопкой сброса , это может помочь, поскольку вы спрашивали о кнопках. Более простой сброс с помощью кнопки здесь.) Наследие Python input() функция работает в ipykernel, но требует дополнительной поддержки для работы в ядре pyodide. И в любом случае их неудобно использовать в Jupyter, где вы можете использовать современные методы пользовательского интерфейса для сбора информации от пользователя.Почему использование ОП print(wdgt) и display(widgt) ничего не показывает (я думаю)
В первом блоке кода ОП есть следующее:
def callback(wdgt):
print(wdgt) # it doesn't print
display(wdgt) # it doesn't display
print(wdgt.value) # it doesn't print
display(wdgt.value) # it doesn't display
И в комментариях подчеркивается, что ОП не видит эту печать или отображение.
ОП мог бы выбрать использование JupyterLab и отметить в «Консоли журнала», что эти печати и дисплеи отправляли выходные данные туда, а не в текущую область вывода Jupyter. (Подробнее об этом ниже.)
Я думаю, что это, по сути, та же проблема, что и этот пост «Кнопки ipywidgets не отвечают» , и мой ответ должен дать понимание. По сути, проблема заключается в том, что «в современных ipywidgets и Jupyter вы должны четко указывать, как вы подключаете генерируемый вывод к области вывода ячейки».interact() использование в моем примере упрощает задачу в данном случае; однако, если ОП действительно захочет продолжить разработку кода в первом блоке, это можно сделать, добавив обработку вывода. Ресурсы по ссылкам в этом разделе могут служить руководством по реализации этого в этом коде.
Выше я упоминал, что JupyterLab в наши дни лучше подходит для разработки с помощью ipywidgets, и вы можете прочитать об этом больше в разделе «Подробности» по соответствующей теме здесь.
interact()Вы можете заметить, что текст заключен в кавычки, которые выглядят странно из-за отображаемого строкового представления, возвращаемого функцией interact. Эта ситуация была оставлена в приведенном выше блоке кода, чтобы упростить код, поскольку вопрос действительно касался только извлечения содержимого из виджета «Текст». Вещи можно сделать менее грубыми, вернув виджет HTML, который будет лучше отображаться в области вывода Jupter, на основе здесь.
from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets
text_input = widgets.Text(
value = "",
description = "Enter text here:",
style = {"description_width": "initial"},
layout=widgets.Layout(width='70%'),
)
def f(x):
if "Hello World" in x:
return widgets.HTML("WHAT YOU TYPED CONTAINS MY FAVORITE PHRASE! YOU DID IT!!")
elif x != '':
return widgets.HTML(f"I see you typed: '{x}'. You haven't typed my favorite phrase yet.")
else:
return widgets.HTML(x)
interact(f, x=text_input);