Краткий ответ: вы не можете сделать это без создания собственного "пользовательского виджета" .Эти атрибуты объектов style
и layout
жестко закодированы как в серверной , так и клиентской библиотеках ipywidgets
.
Существует грязный способ получить подобный эффект, смешивая ButtonStyle
с SelectMultiple
.
# Tested on JupyterLab 0.35.3 with Python 3.6 kernel
import ipywidgets as widgets
from ipywidgets.widgets import widget_serialization, trait_types
from traitlets import Unicode, Instance, CaselessStrEnum
class MySelectMultiple(widgets.SelectMultiple):
style=trait_types.InstanceDict(widgets.ButtonStyle).tag(sync=True, **widget_serialization)
wdg2 = MySelectMultiple(
options=['Apples', 'Oranges', 'Pears'],
value=['Oranges'],
description='Fruits',
layout=widgets.Layout(width='75%', height='80px'),
style= {'button_color':'red'},
disabled=False
)
wdg2
wdg2.style.button_color = 'green'
Еще один грязный способ - вставить правило CSS в блокнот, которое влияет на все виджеты select
.
%%html
<style>
.widget-select > select {background-color: red;}
</style>
Пользовательский виджет
Окончательное решение - создать собственный пользовательский виджет .К сожалению, вы должны написать для него как серверную, так и клиентскую коды.Для классического ноутбука Jupyter код на стороне клиента (JavaScript) может быть помещен в ячейку.Но эта функция может быть исключена из «следующего поколения» Jupyter, то есть JupyterLab , по соображениям безопасности.
Ячейка 1
%%javascript
require.undef('myselectmultiple');
define('myselectmultiple', ["@jupyter-widgets/base"], function(widgets) {
class selectmultipleView extends widgets.SelectMultipleView {
render () {
super.render();
this.mycolor_changed();
this.model.on('change:mycolor', this.mycolor_changed, this);
}
mycolor_changed () {
var mycolor = this.model.get('mycolor')
this.el.childNodes[1].style.backgroundColor = mycolor;
}
}
return {
myselectmultipleview : selectmultipleView
};
});
Ячейка 2
class MySelectMultipleC(widgets.SelectMultiple):
_view_name = Unicode('myselectmultipleview').tag(sync=True)
_view_module = Unicode('myselectmultiple').tag(sync=True)
_view_module_version = Unicode('0.1.0').tag(sync=True)
mycolor = Unicode('white', help='background color').tag(sync=True)
wdg3 = MySelectMultipleC(
options=['Apples', 'Oranges', 'Pears'],
value=['Oranges'],
description='Fruits',
mycolor = 'green',
disabled=False
)
wdg3
Ячейка 3
wdg3.mycolor = 'red'
JupyterLab использует совершенно другой фреймворк.Чтобы приведенный выше пользовательский виджет работал в интерфейсе «Lab», код на стороне клиента должен быть переведен в TypeScript, а затем скомпилирован, собран и установлен на сервере Lab.