Python 使用ipywidget进行多项选择题测试
我对python和python笔记本相当陌生。我正在尝试创建一个Jupyter笔记本,它将显示一个图像列表中的图像,并为用户提供4个选项,让用户在可单击的ipywidget按钮中选择该图像的内容。一旦用户单击他们的选择,我想用一个新图像替换图像,并用4个新选项重新填充按钮 我知道如何使用button.close()清除图像输出并关闭按钮小部件,但我似乎不知道如何使用新选项重新绘制按钮。一旦我关闭了容器,我就不知道如何循环回到顶部,因为一旦做出选择,我就被困在打开按钮的功能中。这是我到目前为止所拥有的,虽然我知道它还没有接近工作的地方,而且它可能在方法上还很遥远。注意:我不需要使用ipywidgets,但从可点击按钮的角度来看,它似乎是一个不错的选择:Python 使用ipywidget进行多项选择题测试,python,jupyter,jupyter-notebook,ipywidgets,Python,Jupyter,Jupyter Notebook,Ipywidgets,我对python和python笔记本相当陌生。我正在尝试创建一个Jupyter笔记本,它将显示一个图像列表中的图像,并为用户提供4个选项,让用户在可单击的ipywidget按钮中选择该图像的内容。一旦用户单击他们的选择,我想用一个新图像替换图像,并用4个新选项重新填充按钮 我知道如何使用button.close()清除图像输出并关闭按钮小部件,但我似乎不知道如何使用新选项重新绘制按钮。一旦我关闭了容器,我就不知道如何循环回到顶部,因为一旦做出选择,我就被困在打开按钮的功能中。这是我到目前为止所拥
x = ['tree.jpg','house.jpg','car.jpg','door.jpg','train.jpg','moon.jpg']
choices = random.sample(x, 4)
correct = random.choice(choices)
display(Image(correct))
time.sleep(3)
button1 = widgets.Button(description = x[0])
button2 = widgets.Button(description = x[1])
button3 = widgets.Button(description = x[2])
button4 = widgets.Button(description = x[3])
container = widgets.HBox(children=[button1,button2,button3,button4])
display(container)
button1.on_click(on_button1_clicked)
button2.on_click(on_button2_clicked)
button3.on_click(on_button3_clicked)
button4.on_click(on_button4_clicked)
def on_button1_clicked(b):
# [insert code to record choice]
container.close()
clear_output()
def on_button2_clicked(b):
# [insert code to record choice]
container.close()
clear_output()
def on_button3_clicked(b):
# [insert code to record choice]
container.close()
clear_output()
def on_button4_clicked(b):
# [insert code to record choice]
container.close()
clear_output()
非常感谢 如果我了解您想要做什么,您可以将所有内容放入单独的函数中,并在每次单击按钮时调用该函数:
import random
import time
from IPython.display import Image, display, clear_output
from ipywidgets import widgets
x = ['tree.jpg','house.jpg','car.jpg','door.jpg','train.jpg','moon.jpg']
def redraw():
choices = random.sample(x, 4)
correct = random.choice(choices)
display(Image(correct))
time.sleep(3)
button1 = widgets.Button(description = choices[0])
button2 = widgets.Button(description = choices[1])
button3 = widgets.Button(description = choices[2])
button4 = widgets.Button(description = choices[3])
container = widgets.HBox(children=[button1,button2,button3,button4])
display(container)
def on_button1_clicked(b):
# [insert code to record choice]
container.close()
clear_output()
redraw()
def on_button2_clicked(b):
# [insert code to record choice]
container.close()
clear_output()
redraw()
def on_button3_clicked(b):
# [insert code to record choice]
container.close()
clear_output()
redraw()
def on_button4_clicked(b):
# [insert code to record choice]
container.close()
clear_output()
redraw()
button1.on_click(on_button1_clicked)
button2.on_click(on_button2_clicked)
button3.on_click(on_button3_clicked)
button4.on_click(on_button4_clicked)
redraw() # initializes the first choice
一些评论:
- 我想在对按钮的描述中,您希望
您选择的4个样本中的文本(即来自
)不是 列表的前四个元素选项
(因为它们不会改变)x
- 您可能不希望将选项数硬编码为4,因为这样您就可以硬编码4个按钮和4个按钮功能等。您可能希望根据所需的选项数生成按钮列表。比如:
节省大约一半的代码nchoices = 4 x = ['tree.jpg','house.jpg','car.jpg','door.jpg','train.jpg','moon.jpg'] def redraw(): choices = random.sample(x, nchoices) correct = random.choice(choices) display(Image(correct)) time.sleep(3) buttons = [widgets.Button(description = choice) for choice in choices] container = widgets.HBox(children=buttons) display(container) def on_button_clicked(b): # [insert code to record choice] container.close() clear_output() redraw() for button in buttons: button.on_click(on_button_clicked) redraw()
- 我不知道你想通过点击一个按钮对选择做什么,但我可以想象你想将
与选择
进行比较,然后用这些信息做一些事情。您只需通过更正
即可进行比较,建议您在条件为b.description==correct
和True
的情况下,将按钮涂成绿色即可:'red'
def on_button_clicked(b): choice = b.description b.color = 'white' b.background_color = 'green' if choice == correct else 'red' time.sleep(5) container.close() clear_output() redraw()
while
循环,在满足条件后中断
s?效果非常好!非常感谢你!我不知道函数中的一个函数,比如点击按钮(b)可以调用父函数redraw()。理解这一点非常有用。@Snapula-不客气!这是一种在这种情况下起作用的类型。非常有用:)