On 09/08/2010 11:32 AM, HMark wrote:
> I'm following up to see if someone has any ideas/suggestions for how
> to create a GUI in the notebook and interact with it in a bi-
> 
> directional way, where Python code (with the help of Javascript?) can
> not only "read" the GUI controls, but also impact/write them.
> 
> Any example/pointer would be really appreciated.


I think implementing the features you suggest is feasible.
Unfortunately, I can't examine the problem in detail right now.

But could you look at

http://alpha.sagenb.org/home/pub/32/

?


> On Sep 2, 10:17 am, HMark <[email protected]> wrote:
>> Thank you, Mitesh.
>>
>> On Sep 1, 3:59 pm, Mitesh Patel <[email protected]> wrote:
>>
>>> If we added a unique HTML 'id' attribute to the input element, perhaps
>>> we could wrap
>>
>>> html('<script>jQuery("#unique_id_for_this_input").val({0});</script>'.format(n_points_global))
>>
>>> in a friendlier Python function that we could insert here?
>>
>> If I understand your proposal correctly, your example shows a way to
>> manipulate/alterthe state/rendering of a control (like a slider,
>> input_box, etc.), which is one direction.
>>
>> I envision both directions (from control to Python code <implemented
>> today>, and from Python code to control <new capability>) having to be
>> equally easy/consistent, so that if you create a GUI with @interact or
>> any other way, this GUI would both control as well as reflect (be
>> impacted by)the stateof the running math model.
>>
>> So a simple example (with just an InputBox control) could be something
>> like (and again, apologies, if I'm just not getting the current
>> capabilities, and all this is somehow already possible):
>>
>> # define all GUI controls:
>> Theta = sagenb.notebook.interact.InputBox('theta', default_value=2,
>> label='The angle (theta): ', width=5)
>>
>> # render GUI:
>> html(Theta.label() + Theta.render())
>>
>> # impact/affect the GUI:
>> # input_value = Theta.value() # desired: get the current value (not
>> just the default_value, which is currently implemented)
>> input_value = Theta.default_value() # exists: not necessarily the
>> current value, but default_value() is currently implemented
>> print "The value of", Theta.var(), "is", input_value
>>
>> input_value += 1 # any manipulation here
>>
>> # Theta.value(input_value) # desired: set the control to the new value
>> # print "The value of", Theta.var(), "has been modified to:",
>> Theta.value() # desired: get the current, newly modified value
>> print "The value of", Theta.var(), "has been modified to:",
>> input_value # exists: wrong, but since we can't get the modified
>> value...
>>
>> Thanks,
>>         Mark
>>
>>>> On Sep 1, 12:21 pm,HMark<[email protected]> wrote:
>>>>> One thing I'm missing is a way to change interact widget rendering in
>>>>> the browser, from within the code.
>>
>>>>> So, in the simple example athttp://www.sagenb.org/home/pub/2409/(and
>>>>> also below), what I'd like to see is that the n_points_local input_box
>>>>> widget (in this case, but other types of widgets in general) gets
>>>>> updated every time a new point is added, and n_points_global and
>>>>> n_points_local get modified.
>>
>>>>> Similarly, the code changesthe stateof the point_operation buttons
>>>>> to 'Reset' after every time a point is added, but the button widgets
>>>>> rendering doesn't reflect that.
>>
>>>>> 1. is there a way to do this with the built-in functionality, or do I
>>>>> need to build a custom GUI with widgets rendered outside of @interact
>>>>> (but within the browser)?
>>
>>>>> 2. Regardless, are there examples of custom GUIs, rendered in the
>>>>> browser (Notebook), interacting with the sage functionality, I can
>>>>> look at?
>>
>>>>> Any pointers would be appreciated.
>>
>>>>> # --- global ---
>>>>> display_points = Graphics()
>>>>> n_points_global = 5
>>
>>>>> for i in range(n_points_global):
>>>>>     display_points += point((round(10 * random(), 0), round(10 *
>>>>> random(), 0)))
>>
>>>>> @interact
>>>>> def point_setting(
>>>>>         point_operation = ['Reset', 'Add a point'],
>>>>>         n_points_local = input_box(default = n_points_global, label =
>>>>> 'number of points:', width = 5)
>>>>>     ):
>>>>>     global display_points, n_points_global
>>
>>>>>     if point_operation == 'Add a point':
>>>>>         display_points += point((round(10 * random(), 0), round(10 *
>>>>> random(), 0)))
>>>>>         n_points_global += 1
>>>>>         n_points_local = n_points_global
>>>>>         point_operation = 'Reset'
>>>>>     print "number of points = ", len(display_points)
>>>>>     show(display_points, xmin = 0, xmax = 10, ymin = 0, ymax = 10)
> 

-- 
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sage-support
URL: http://www.sagemath.org

Reply via email to