Распечатать Gnuplot для Kivy Widget - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу реализовать это MWE:

https://stackoverflow.com/a/44922317/6924364

Но с Gnuplot, похожим на это:

https://stackoverflow.com/a/21633082/6924364

Как я могу передать вывод Gnuplot в приложение Kivy и отобразить изображение, не сохраняя его локально?


Редактировать 1: Вот MWE, которому просто требуется некоторый код для добавления объекта изображения впользовательский виджет, но я не уверен, как это сделать.

from subprocess import Popen, PIPE
from StringIO import StringIO                                            
from io import BytesIO
from os import linesep as nl
from PIL import Image as Image

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.core.image import Image as CoreImage


def gnuplot(commands, data):                                                    
    """ drive gnuplot, expects lists, returns stdout as string """              

    dfile = StringIO()                                                          
    for line in data:                                                           
        dfile.write(str(line) + nl)                                             

    args = ["gnuplot", "-e", (";".join([str(c) for c in commands]))]            
    p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE)                       

    dfile.seek(0)                                                               
    return p.communicate(dfile.read())[0]   


def gnuplot_GifTest():
    commands = [\
        "set datafile separator ','",\
        "set terminal png",\
        "set output",\
        "plot '-' using 1:2 with linespoints, '' using 1:2 with linespoints",\
        ]
    data = [\
        "1,1",\
        "2,2",\
        "3,5",\
        "4,2",\
        "5,1",\
        "e",\
        "1,5",\
        "2,4",\
        "3,1",\
        "4,4",\
        "5,5",\
        "e",\
        ]

    return (commands, data)


class Plot(Widget):

    (commands, data) = gnuplot_GifTest()
    img = BytesIO(gnuplot(commands,data))
    anImg = CoreImage(img,ext="png")

    def __init__(self,**kwargs):
        super(Plot,self).__init__(**kwargs)

        # HMM, how to display self.anImg??
        print self.anImg

class MyApp(App):

    def build(self):
        box = BoxLayout(orientation="vertical")
        box.add_widget(Plot())
        return box

MyApp().run()

1 Ответ

0 голосов
/ 08 декабря 2018

После некоторых исследований я нашел решение своей проблемы.Я оставлю это открытым на выходных для других читателей, если будут другие решения.

from subprocess import Popen, PIPE
from StringIO import StringIO                                            
from io import BytesIO
from os import linesep as nl
from PIL import Image as Image

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.core.image import Image as CoreImage
from kivy.uix.image import Image as UIXImage

def gnuplot(commands, data):                                                    
    """ drive gnuplot, expects lists, returns stdout as string """              

    dfile = StringIO()                                                          
    for line in data:                                                           
        dfile.write(str(line) + nl)                                             

    args = ["gnuplot", "-e", (";".join([str(c) for c in commands]))]            
    p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE)                       

    dfile.seek(0)                                                               
    return p.communicate(dfile.read())[0]   


def gnuplot_GifTest():
    commands = [\
        "set datafile separator ','",\
        "set terminal gif",\
        "set output",\
        "plot '-' using 1:2 with linespoints, '' using 1:2 with linespoints",\
        ]
    data = [\
        "1,1",\
        "2,2",\
        "3,5",\
        "4,2",\
        "5,1",\
        "e",\
        "1,5",\
        "2,4",\
        "3,1",\
        "4,4",\
        "5,5",\
        "e",\
        ]

    return (commands, data)


class Plot(UIXImage):

    def __init__(self,commands,data,**kwargs):
        super(Plot,self).__init__(**kwargs)
        gnu_img = BytesIO(gnuplot(commands,data))
        gnu_converted = CoreImage(gnu_img,ext="gif")
        self.texture = gnu_converted.texture


class MyApp(App):

    def build(self):
        (commands, data) = gnuplot_GifTest() # example for passing gnuplot commands and data to the plot widget
        box = BoxLayout(orientation="vertical")
        box.add_widget(Plot(commands,data))
        return box

MyApp().run()
...