Python:在处理小部件的数据输出时运行散景服务器

问题描述 投票:1回答:1

我有一个越来越大的小项目。所以我决定将项目分成单独的模块。现在我有问题来管理散景小部件的事件处理程序.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",)

谢谢保罗

python-3.x bokeh
1个回答
0
投票

我找到了一个解决方案:.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
© www.soinside.com 2019 - 2024. All rights reserved.