Yes. Although I think the draw...do function is actually redraw...do (this is actually a shared interface with Tk.jl, although I recommend Gtk :)
Sent from my phone. On Tuesday, June 17, 2014, Abe Schneider <[email protected]> wrote: > @Tim: Awesome, exactly what I was looking for. Thank you. > > @Jameson: Just to check, do you mean something like: > > function redraw_canvas(canvas) > draw(canvas) > end > > draw(canvas) do widget > # ... > end > > If so, I'll re-post my code with the update. It may be useful to someone > else to see the entire code as an example. > > Thanks! > A > > > On Tuesday, June 17, 2014 10:44:16 AM UTC-4, Jameson wrote: >> >> This code is not valid, since getgc does not always have a valid drawing >> context to return. Instead you need to provide Canvas with a callback >> function via a call to redraw in which you do all the work, then just call >> draw(canvas) in your timer callback to force an update to the view. >> double-buffering is enabled by default. >> >> wait(Condition()) is the same wait(), and means sleep until this task is >> signaled, and thereby prevents the program from exiting early >> >> >> On Tue, Jun 17, 2014 at 7:46 AM, Abe Schneider <[email protected]> >> wrote: >> >>> Thank you everyone for the fast replies! >>> >>> After looking at ImageView and the sources, here's the solution I came >>> up with: >>> >>> w = Gtk.@Window() |> >>> (body=Gtk.@Box(:v) |> >>> (canvas=Gtk.@Canvas(600, 600)) |> >>> showall >>> >>> function redraw_canvas(canvas) >>> ctx = getgc(canvas) >>> h = height(canvas) >>> w = width(canvas) >>> >>> # draw background >>> rectangle(ctx, 0, 0, w, h) >>> set_source_rgb(ctx, 1, 1, 1) >>> fill(ctx) >>> >>> # draw objects >>> # ... >>> >>> # tell Gtk+ to redisplay >>> draw(canvas) >>> end >>> >>> function init(canvas, delay::Float64, interval::Float64) >>> update_timer = Timer(timer -> redraw_canvas(canvas)) >>> start_timer(update_timer, delay, interval) >>> end >>> >>> update_timer = init(canvas, 2, 1) >>> if !isinteractive() >>> wait(Condition()) >>> end >>> >>> stop_timer(update_timer) >>> >>> I haven't looked yet into what is required to do double-buffering (or if >>> it's enabled by default). I also copied the 'wait(Condition())' from the >>> docs, though it's not clear to me what the condition is (if I close the >>> window, the program is still running -- I'm assuming that means I need to >>> connect the signal for window destruction to said condition). >>> >>> A >>> >>> >>> On Monday, June 16, 2014 9:33:42 PM UTC-4, Jameson wrote: >>> >>>> I would definately use Julia's timers. See `Gtk.jl/src/cairo.jl` for an >>>> example interface to the Cairo backing to a Gtk window (used in >>>> `Winston.jl/src/gtk.jl`). If you are using this wrapper, call `draw(w)` to >>>> force a redraw immediately, or `draw(w,false)` to queue a redraw request >>>> for when Gtk is idle. >>>> >>>> >>>> On Mon, Jun 16, 2014 at 9:12 PM, Tim Holy <[email protected]> wrote: >>>> >>>>> ImageView's navigation.jl contains an example. The default branch is Tk >>>>> (because as far as binary distribution goes, Tk is "solved" and Gtk >>>>> isn't >>>>> yet), but it has a gtk branch you can look at. >>>>> >>>>> --Tim >>>>> >>>>> On Monday, June 16, 2014 04:01:46 PM Abe Schneider wrote: >>>>> > I was looking for a way to display a simulation in Julia. Originally >>>>> I was >>>>> > going to just use PyPlot, but it occurred to me it would be better >>>>> to just >>>>> > use Gtk+ + Cairo to do the drawing rather than something whose main >>>>> purpose >>>>> > is drawing graphs. >>>>> > >>>>> > So far, following the examples on the Github page, I have no problem >>>>> > creating a window with a Cairo canvas. I can also display content on >>>>> the >>>>> > canvas fairly easily (which speaks volumes on the awesomeness of >>>>> Julia and >>>>> > the Gtk+ library). However, after looking through the code and >>>>> samples, >>>>> > it's not obvious to me how to redraw the canvas every fraction of a >>>>> second >>>>> > to display new content. >>>>> > >>>>> > I did find an example of animating with Cairo and Gtk+ in C >>>>> > (http://cairographics.org/threaded_animation_with_cairo/). However, >>>>> I >>>>> > assume one would want to use Julia's timers instead of of GLibs? >>>>> Secondly, >>>>> > there in their function 'timer_exe', call is made directly to Gtk+ >>>>> to send >>>>> > a redraw queue to the window. Is there a cleaner way to do it with >>>>> the Gtk+ >>>>> > library? >>>>> > >>>>> > Thanks! >>>>> > A >>>>> >>>>> >>>> >>
