2012-06-29 2 views
2

Я бегу встроенной консоли IPython с помощью (упрощенно):Замена InteractiveShellEmbed с Qt консоли

# the code uses PyQt4, this makes sure it is initialized properly 
import IPython.lib.inputhook 
qapp=IPython.lib.inputhook.enable_gui(gui='qt4') 
# create the embedded terminal 
from IPython.frontend.terminal.embed import InteractiveShellEmbed 
ipshell=InteractiveShellEmbed() 
ipshell() 

Что бы этот код выглядеть, если я хотел бы запустить IPython-х Qt console вместо встроенного терминала оболочки? Есть примеры использования ipython qtconsole со всех сторон, но не как интегрировать его в мой собственный код.

+0

Я хотел бы сделать то же самое - хороший вопрос –

+0

в Qt консоли нормально работает в двух процессах - интерфейс и ядро ​​(которое фактически запускает код). Пример внедрения ядра в ваше собственное приложение: https://github.com/ipython/ipython/blob/master/docs/examples/lib/ipkernel_qtapp.py –

+0

@TomasK: Спасибо! Можете ли вы поместить его в качестве аведера, чтобы я мог его принять? Это выглядит намного проще, чем то, что опубликовал Maciek D. Да, я знаю, что он работает нормально в 2 процессах, но у меня есть другой графический интерфейс на основе PyQt4 в основном процессе, поэтому мне нужно также запустить консоль. – eudoxos

ответ

0

Существует пример сценария, который работает в этом вопросе: Embedding IPython Qt console in a PyQt application

Здесь вы можете найти его для справки:

from IPython.zmq.ipkernel import IPKernelApp 
from IPython.lib.kernel import find_connection_file 
from IPython.frontend.qt.kernelmanager import QtKernelManager 
from IPython.frontend.qt.console.rich_ipython_widget import RichIPythonWidget 
from IPython.utils.traitlets import TraitError 
from PySide import QtGui, QtCore 
import atexit 

def event_loop(kernel): 
    kernel.timer = QtCore.QTimer() 
    kernel.timer.timeout.connect(kernel.do_one_iteration) 
    kernel.timer.start(1000*kernel._poll_interval) 

def default_kernel_app(): 
    app = IPKernelApp.instance() 
    app.initialize(['python', '--pylab=qt', '--profile=plask']) 
    app.kernel.eventloop = event_loop 
    return app 

def default_manager(kernel): 
    connection_file = find_connection_file(kernel.connection_file) 
    manager = QtKernelManager(connection_file=connection_file) 
    manager.load_connection_file() 
    manager.start_channels() 
    atexit.register(manager.cleanup_connection_file) 
    return manager 

def console_widget(manager): 
    try: # Ipython v0.13 
     widget = RichIPythonWidget(gui_completion='droplist') 
    except TraitError: # IPython v0.12 
     widget = RichIPythonWidget(gui_completion=True) 
    widget.kernel_manager = manager 
    return widget 

def terminal_widget(**kwargs): 
    kernel_app = default_kernel_app() 
    manager = default_manager(kernel_app) 
    widget = console_widget(manager) 

    # Update namespace               
    kernel_app.shell.user_ns.update(kwargs) 

    kernel_app.start() 
    return widget 

# This simply opens qtconsole widged in a new window. But you can find embed it wherever you want 
app = QtGui.QApplication(['']) 
widget = terminal_widget(testing=123) 
widget.setWindowTitle("Your console") 
widget.show() 
app.exec_() 
Смежные вопросы