Буферная функция для Python 3+ - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь открыть окно vtk, используя vtk_show, но моя консоль Ipython падает каждый раз, когда я делаю это, по-видимому, это потому, что Ipython не может отобразить внешнее окно, что в точности и делает vtk_show. Я искал в Google решение, но оно написано для python2 (я использую python 3.6.3). Вот решение, которое я нашел:

import vtk
from IPython.display import Image

def vtk_show(renderer, width=400, height=300):
    """
    Takes vtkRenderer instance and returns an IPython Image with the 
    rendering.
    """
    renderWindow = vtk.vtkRenderWindow()
    renderWindow.SetOffScreenRendering(1)
    renderWindow.AddRenderer(renderer)
    renderWindow.SetSize(width, height)
    renderWindow.Render()

    windowToImageFilter = vtk.vtkWindowToImageFilter()
    windowToImageFilter.SetInput(renderWindow)
    windowToImageFilter.Update()

    writer = vtk.vtkPNGWriter()
    writer.SetWriteToMemory(1)
    writer.SetInputConnection(windowToImageFilter.GetOutputPort())
    writer.Write()
    data = str(buffer(writer.GetResult()))

    return Image(data)

Я получаю сообщение об ошибке при попытке использовать встроенную функцию buffer python2, но так как эта функция не существует в python3 +, я застрял .. Если кто-нибудь может мне помочь с этим, я был бы очень ценится Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Чтобы прояснить, я полагаю, что этот пример был адаптацией очень информативного примера блога, показывающего, как извлечь поверхности из медицинских изображений, используя алгоритм движущихся кубов ВТК . прилагаемый блокнот Jupyter предназначался для Python 2.7, и, как уже упоминалось для его использования в Python 3.6+, часть data=... необходимо изменить.

import vtk
from IPython.display import Image

def vtk_show(renderer, width=400, height=300):
    """
    Takes vtkRenderer instance and returns an IPython Image with the 
    rendering.
    """
    renderWindow = vtk.vtkRenderWindow()
    renderWindow.SetOffScreenRendering(1)
    renderWindow.AddRenderer(renderer)
    renderWindow.SetSize(width, height)
    renderWindow.Render()

    windowToImageFilter = vtk.vtkWindowToImageFilter()
    windowToImageFilter.SetInput(renderWindow)
    windowToImageFilter.Update()

    writer = vtk.vtkPNGWriter()
    writer.SetWriteToMemory(1)
    writer.SetInputConnection(windowToImageFilter.GetOutputPort())
    writer.Write()
    data = memoryview(writer.GetResults()).tobytes()

    return Image(data)

Кредит на решение определенно идет @MafiaSkafia и @jcgiret, но я хотел опубликовать полное и окончательное решение.

0 голосов
/ 04 мая 2018

Как минимум эти две точки должны быть изменены в вашем коде, чтобы иметь одинаковое поведение с Python 3:

Таким образом, строка data = ... должна выглядеть так:

data = bytes(memoryview(writer.GetResult()))
...