我有一个越来越大的小项目。所以我决定将项目分成单独的模块。现在我有问题来管理散景小部件的事件处理程序.on_change。
散景应用程序目录如下所示:
bokeh_app_test
|
+---scripts
| +---__init__.py
| +---corporates .py
|
+---__init__.py
+---main.py
我通过Windows cmd启动应用程序:python -m bokeh serve --show bokeh_app_test
Python 3.6.6 Anaconda和Bokeh服务器版本0.13.0
卖弄.朋友:
import datetime
from bokeh.io import curdoc
from bokeh.models.widgets import Tabs
# scripts
from scripts.corporates import Corporate
# =============================================================================
# definitions
# =============================================================================
StartDate = datetime.date(2018,1,1)
EndDate = datetime.date(2018,8,30)
lLevel1 = ['Corporates', 'Sovereigns', 'Collateralized']
# =============================================================================
# programm code
# =============================================================================
corptab = Corporate(lLevel1,StartDate,EndDate)
corporate_tab = corptab.corp_tab()
tabs = Tabs(tabs = [corporate_tab])
curdoc().add_root(tabs)
和corporates.py
from bokeh.layouts import gridplot
from bokeh.models.widgets import Panel, PreText, DatePicker, Select
class Corporate(object):
def __init__(self, lLevel1, StartDate, EndDate):
self.lLevel1 = lLevel1
self.EndDate = EndDate
self.StartDate = StartDate
self.corp_date_picker1 = DatePicker(min_date=self.StartDate,
max_date= self.EndDate,
value=(self.StartDate),
title="Start")
self.corp_date_picker2 = DatePicker(min_date= self.StartDate,
max_date= self.EndDate,
value=(self.EndDate),
title="End")
self.corp_level_select = Select(title="Level1:",
value="Sovereigns",
options=self.lLevel1)
self.text = PreText(text='', width=1000)
def corp_date_picker1_change(attrname, old, new):
self.update_corp_data()
def corp_date_picker2_change(attrname, old, new):
self.update_corp_data()
def corp_level_select_change(attrname, old, new):
self.update_corp_data()
def update_corp_data(self):
StartDate = self.corp_date_picker1.value
EndDate = self.corp_date_picker2.value
Level = self.corp_level_select.value
self.text.text= "StartDate:{}; EndDate:{}; Level: {}".format(StartDate,EndDate,Level)
def corp_tab(self):
grid = gridplot([[self.corp_date_picker1, self.corp_date_picker2, self.corp_level_select],
[self.text]])
self.corp_date_picker1.on_change('value', Corporate.corp_date_picker1_change)
self.corp_date_picker2.on_change('value', Corporate.corp_date_picker2_change)
self.corp_level_select.on_change('value', Corporate.corp_level_select_change)
tab = Panel(child=grid, title='TAB 1')
self.update_corp_data()
return tab
错误
服务器启动没有任何错误,小部件显示为假设:enter image description here
但是,如果我更改窗口小部件的值,则会弹出以下错误:
2018-08-30 15:37:24,692 error handling message Message 'PATCH-DOC' (revision 1): NameError("name 'self' is not defined",)
谢谢保罗
我找到了一个解决方案:.on_change回调函数只允许“attr,old,new”,但我也需要自己。所以我切断了回调并将其粘贴到主程序中。有没有人有更好的解决方案?
卖弄.朋友
import datetime
from bokeh.io import curdoc
from bokeh.models.widgets import Tabs
# scripts
from scripts.corporates import Corporate
# =============================================================================
# definitions
# =============================================================================
StartDate = datetime.date(2018,1,1)
EndDate = datetime.date(2018,8,30)
lLevel1 = ['Corporates', 'Sovereigns', 'Collateralized']
# =============================================================================
# programm code
# =============================================================================
corptab = Corporate(lLevel1,StartDate,EndDate)
corporate_tab = corptab.corp_tab()
def corptab_change(attrname, old, new):
corptab.update_corp_data(corptab.corp_date_picker1.value,
corptab.corp_date_picker2.value,
corptab.corp_level_select.value)
corptab.corp_date_picker1.on_change('value', corptab_change)
corptab.corp_date_picker2.on_change('value', corptab_change)
corptab.corp_level_select.on_change('value', corptab_change)
tabs = Tabs(tabs = [corporate_tab])
curdoc().add_root(tabs)
corporates.朋友
from bokeh.layouts import gridplot
from bokeh.models.widgets import Panel, PreText, DatePicker, Select
class Corporate(object):
def __init__(self, lLevel1, StartDate, EndDate):
self.lLevel1 = lLevel1
self.EndDate = EndDate
self.StartDate = StartDate
self.corp_date_picker1 = DatePicker(min_date=self.StartDate,
max_date= self.EndDate,
value=(self.StartDate),
title="Start")
self.corp_date_picker2 = DatePicker(min_date= self.StartDate,
max_date= self.EndDate,
value=(self.EndDate),
title="End")
self.corp_level_select = Select(title="Level1:",
value="Sovereigns",
options=self.lLevel1)
self.text = PreText(text='', width=1000)
def update_corp_data(self, StartDate, EndDate, Level):
StartDate = StartDate
EndDate = EndDate
Level = Level
self.text.text= "StartDate:{}; EndDate:{}; Level: {}".format(StartDate,EndDate,Level)
def corp_tab(self):
grid = gridplot([[self.corp_date_picker1, self.corp_date_picker2, self.corp_level_select],
[self.text]])
tab = Panel(child=grid, title='TAB 1')
self.update_corp_data(self.corp_date_picker1.value,
self.corp_date_picker2.value,
self.corp_level_select.value)
return tab