[IPython-dev] Ability to Create other Windows

John Omernik john at omernik.com
Wed Feb 11 11:17:55 EST 2015

So after some hacking around this is what I came up with. I'd be
interested on feed back if this is doing something fundamentally
"wrong" I was able to achieve what I was looking for though, which was
a pandas outputted data frame in a new window so I could resize and
scroll through .

from IPython.display import Javascript
from IPython.html import widgets # Widget definitions

 # Used to display widgets in the notebook
from IPython.display import display, HTML, display_pretty,
display_html, display_jpeg, display_png, display_json, display_latex,

results = {}
def sql(line, cell):
    global results
    pd.set_option('max_colwidth', 100000)
    pd.set_option('display.max_rows', None)
    out = runSQL(cell)
    df = pd.DataFrame(out)
    # Assume this is a working happy Pandas Dataframe
    gridhtml = df.to_html()
    window_options = "toolbar=no, location=no, directories=no,
status=no, menubar=no, scrollbars=yes, resizable=yes, width=780,
height=200, top=0, left=0"
    fmd5 = md5(gridhtml) #I've imported the hashlib hexdigest into my own md5()
    base = """var win = window.open("", "&~&", "*~*");
    win.document.body.innerHTML = `%~%`;
    JS = base.replace('%~%', gridhtml) # Put the results in the output
    JS = JS.replace('&~&', fmd5) # Set the title to be the md5
    JS = JS.replace('*~*', window_options) # Include the window options
    results[fmd5] = JS # Store the results in a global dictionary by
using an MD5 key

    button = widgets.Button(description="Results")
    button.tooltip = fmd5 # Set the tool tip to be the Md5 so we can
"pass" this to the call back
    button.on_click(on_button_clicked) # Set the call back


def on_button_clicked(b):
    global results
    fmd5 = b.tooltip # get the md5 from the tooltop
    createwindow(results[fmd5]) #Call the create window

def createwindow(JS):
    j = Javascript(JS)

On Tue, Feb 10, 2015 at 11:28 AM, John Omernik <john at omernik.com> wrote:
> So here is an example of it working without the button, just having
> the window pop up when the the magic is run. So, the idea here is when
> the data query is loaded, the button is added, and every time the
> button is pressed, the window can be reopened. Now it's just a matter
> of playing with the widgets... how do I pass a variable to the button
> on_click event? :)
> On Tue, Feb 10, 2015 at 9:43 AM, John Omernik <john at omernik.com> wrote:
>> This is a weird question I think.
>> I am trying to write a magic function that does something simple with
>> a widget. Basically I want to be able to query a database and when the
>> query is returned have a button that "contains" results.  Like this:
>> %%sql
>> select * from table where field = 1
>> When that is is done, a Button widget appears, with the word results
>> on it. The data is "in there" likely a panda dataframe to_html.  But
>> basically I'd like to be able to, when I press the button have a new
>> window spawned (maybe with a a javascript new window) That has the
>> data in a different window that I can move to a different screen and
>> look at as I am writing more code in my iPython notebooks. (Further
>> enhancements may come out of that down the line)
>> What I have is below.  What happens is when I add a variable to the
>> callback function it seems to click it right away, and there are no
>> results.  I am trying a bunch of stuff here, and still hacking on it,
>> but I thought I'd toss it out here. I am using Jupyter (iPython 3)
>> with Python2 Shell.
>> Note, once the new window is filled with data, and good to go, iPython
>> has no more connection (back and forth data) Basically it's a fly away
>> window, it can stay open, closed etc, it's  independent of the iPython
>> (in my head at least)
>> @register_cell_magic
>> def sql(line, cell):
>>     pd.set_option('max_colwidth', 100000)
>>     pd.set_option('display.max_rows', None)
>>     out = runSQL(cell)
>>     df = pd.DataFrame(out)
>>     # Assume this is a working happy Pandas Dataframe
>>     gridhtml = df.to_html()
>>     JS = """
>> var newwindow=window.open();
>> newwindow.document.open()
>> newwindow.document.write(`%~%`);
>> newwindow.close();
>> """
>>     JS = JS.replace('%~%', gridhtml)
>>     button = widgets.Button(description="Results")
>>     display(button)
>>     button.on_click(on_button_clicked(button, JS))
>> def on_button_clicked(b, JS):
>>     print "I've been clicked"
>>     createWindow(JS)
>> def createWindow(JS)
>>     j = Javascript(JS)
>>     display(k)

More information about the IPython-dev mailing list