def test_js_on_change_executes(self, single_plot_page: SinglePlotPage) -> None: source = ColumnDataSource(dict(x=[1, 2], y=[1, 1])) plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) num_input = NumericInput() num_input.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = single_plot_page(column(num_input, plot)) el = find_element_for(page.driver, num_input, "input") enter_text_in_element(page.driver, el, "10") results = page.results assert results['value'] == 10 # double click to highlight and overwrite old text enter_text_in_element(page.driver, el, "20", click=2) results = page.results assert results['value'] == 20 # Check clicking outside input also triggers enter_text_in_element(page.driver, el, "30", click=2, enter=False) page.click_canvas_at_position(plot, 10, 10) results = page.results assert results['value'] == 30 assert page.has_no_console_errors()
def test_float_inputs(self, single_plot_page: SinglePlotPage) -> None: values_to_enter = [ "0", "1", "-1", "+5", "0.1", "-0.1", "+0.1", "-.1", "+.1", "1e-6", "1.e5", "-1e+3", "-1.e-5", "a" ] expected_results = [ 0, 1, -1, 5, 0.1, -0.1, 0.1, -0.1, 0.1, 1e-6, 10, -1e3, -1e-5, None ] source = ColumnDataSource(dict(x=[1, 2], y=[1, 1])) plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) num_input = NumericInput(high=10, mode="float") num_input.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = single_plot_page(column(num_input, plot)) el = find_element_for(page.driver, num_input, "input") for val, res in zip(values_to_enter, expected_results): el.clear() enter_text_in_element(page.driver, el, val) results = page.results assert results['value'] == res
def test_server_on_change_round_trip( self, bokeh_server_page: BokehServerPage) -> None: num_input = NumericInput(low=-1, high=100, value=4) modify_doc, plot = mk_modify_doc(num_input) page = bokeh_server_page(modify_doc) el = find_element_for(page.driver, num_input, "input") enter_text_in_element(page.driver, el, "2") page.eval_custom_action() results = page.results assert results['data']['val'] == [4, 42] # double click to highlight and overwrite old text enter_text_in_element(page.driver, el, "34", click=2) page.eval_custom_action() results = page.results assert results['data']['val'] == [42, 34] # Check clicking outside input also triggers enter_text_in_element(page.driver, el, "56", click=2, enter=False) page.click_canvas_at_position(plot, 10, 10) page.eval_custom_action() results = page.results assert results['data']['val'] == [34, 56]
def test_display_number_input(self, bokeh_model_page: BokehModelPage) -> None: num_input = NumericInput() page = bokeh_model_page(num_input) el = find_element_for(page.driver, num_input, "input") assert el.get_attribute('type') == "text" assert page.has_no_console_errors()
def test_display_number_input(self, bokeh_model_page) -> None: num_input = NumericInput(css_classes=["foo"]) page = bokeh_model_page(num_input) el = page.driver.find_element_by_css_selector('.foo input') assert el.get_attribute('type') == "text" assert page.has_no_console_errors()
def test_displays_placeholder(self, bokeh_model_page: BokehModelPage) -> None: num_input = NumericInput(placeholder="placeholder") page = bokeh_model_page(num_input) el = find_element_for(page.driver, num_input, "label") assert el.text == "" el = find_element_for(page.driver, num_input, "input") assert el.get_attribute('placeholder') == "placeholder" assert el.get_attribute('type') == "text"
def test_displays_placeholder(self, bokeh_model_page) -> None: num_input = NumericInput(placeholder="placeholder", css_classes=["foo"]) page = bokeh_model_page(num_input) el = page.driver.find_element_by_css_selector('.foo label') assert el.text == "" el = page.driver.find_element_by_css_selector('.foo input') assert el.get_attribute('placeholder') == "placeholder" assert el.get_attribute('type') == "text"
def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1], val=["a", "b"])) plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y')) plot.add_tools( CustomAction(callback=CustomJS(args=dict(s=source), code=RECORD("data", "s.data")))) num_input = NumericInput(low=-1, high=100, value=4, css_classes=["foo"]) def cb(attr, old, new): source.data['val'] = [old, new] num_input.on_change('value', cb) doc.add_root(column(num_input, plot)) return doc
def test_low_high(self, single_plot_page: SinglePlotPage) -> None: source = ColumnDataSource(dict(x=[1, 2], y=[1, 1])) plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) num_input = NumericInput(value=4, low=-1, high=10) num_input.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = single_plot_page(column(num_input, plot)) el = find_element_for(page.driver, num_input, "input") assert el.get_attribute('value') == "4" enter_text_in_element(page.driver, el, "30", click=2) assert el.get_attribute('value') == "10" enter_text_in_element(page.driver, el, "-10", click=2) assert el.get_attribute('value') == "-1"
def test_server_on_change_no_round_trip_without_enter_or_click( self, bokeh_server_page: BokehServerPage) -> None: num_input = NumericInput(low=-1, high=100, value=4) modify_doc, _ = mk_modify_doc(num_input) page = bokeh_server_page(modify_doc) el = find_element_for(page.driver, num_input, "input") enter_text_in_element( page.driver, el, "pre", enter=False) # not change event if enter is not pressed page.eval_custom_action() results = page.results assert results['data']['val'] == ["a", "b"]
method.on_change('value', lambda attr, old, new: setInfo(title=new)) # 障碍物类型 impedimentType = Select(title='障碍类型', value='矩形障碍_设置', options=['矩形障碍_设置', '随机矩形', '随机圆', '随机矩形+随机圆']) impedimentType.on_change('value', lambda attr, old, new: setInfo(imType=new)) # 在x情况下执行 算法 新增点 newNode = [Button(label='刷新随机', width=120, button_type="primary"), Button(label='► 开始', width=60, button_type="primary")] newNode[0].on_click(reFlash) newNode[1].on_click(buttonOnchange) setInfo(newNode=newNode) # goal 的半径 goalRadius = Slider(title="目标点的半径", value=1, start=1, end=max(initInfo.get('xlen'), initInfo.get('ylen')) / 10, step=1) goalRadius.on_change('value', lambda attr, old, new: setInfo(goalRadius=new)) # input test start_x = NumericInput(title='start_x', value=min(initInfo.get('startPoint')[0], initInfo.get('xlen') - 1), low=0, high=initInfo.get('xlen') - 1, width=60) start_x.on_change('value', pointOnchange) start_y = NumericInput(title='start_y', value=min(initInfo.get('startPoint')[1], initInfo.get('ylen') - 1), low=0, high=initInfo.get('ylen') - 1, width=60) start_y.on_change('value', pointOnchange) end_x = NumericInput(title='end_x', value=min(initInfo.get('endPoint')[0], initInfo.get('xlen') - 1), low=0, high=initInfo.get('xlen') - 1, width=60) end_x.on_change('value', pointOnchange) end_y = NumericInput(title='end_y', value=min(initInfo.get('endPoint')[1], initInfo.get('ylen') - 1), low=0, high=initInfo.get('ylen') - 1, width=60) end_y.on_change('value', pointOnchange) # 造对象 显示 initInfo['layout'] = row( column(method, xLenSlider, yLenSlider, impedimentType, goalRadius, row(start_x, start_y, end_x, end_y), row(newNode)), initInfo.get('p'))