Python Bokeh markup text value can't update

时间秒杀一切 提交于 2019-12-31 07:15:10

问题


I'm building Bokeh server to host an SQL query function, on the webpage I wanna print the query status so I used a Markup widget and updates text value of it. However the message of "Running query, please wait..." never show up, only the last value can display when function execution is done.

How can I find where the problem is?

Below is part of my code:

def submit_query():
    para_status.text = "Running query, please wait..."
    cnx = mysql.connector.connect(**SQL_config)
    query = clause_build()  #call the query clause from another def
    df = pd.read_sql(query, cnx)
    cnx.close()
    if df.size >0:
        para_status.text = ("Data query is done, total " + \
        str(int(df.shape[0])) + " rows.")
        df.to_csv(dpath + './query_result.csv', index = False)
    else:
        para_status.text = "Oops, result is empty, please refine the filters and try again."

para_status = PreText(text = '')

btn_submit = Button(label = "Submit query", button_type="success")
btn_submit.on_click(submit_query)

page = column(btn_submit, para_status)

回答1:


Bokeh state only synchronizes with the browser when the callback ends. If you want to do some update, then alot of blocking work, then another update, you will need to split things up so the first callback completes immediately then schedules the rest of the work to happen after the return. The simplest way is with add_next_tick_callback:

from time import sleep
from bokeh.io import curdoc
from bokeh.layouts import column
from bokeh.models import Button, Div

d = Div(text="start")

b = Button()

def work():
    sleep(2)
    d.text = "end"

def cb():
    d.text = "middle"
    curdoc().add_next_tick_callback(work)

b.on_click(cb)

curdoc().add_root(column(d, b))


来源:https://stackoverflow.com/questions/59196855/python-bokeh-markup-text-value-cant-update

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!