与不同的后端一致地绘制

pero的Python项目详细描述


pero

pero库背后的主要动机是为多个绘图后端提供统一的api,如 PyQt5wxPythonPyCairoPyMuPDFPythonista(可能还有更多),这很容易理解和使用。在 通用的绘图功能、大量的预构建图示符以及易于使用的路径、矩阵 转换等。根据可用的后端库,可以直接查看图形或将其导出到 图像格式。

自从我发现了很棒的d3jsjavascript库之后,我就想拥有同样令人惊奇的 python图形中动态属性的概念。事实上,这是启动pero 图书馆。最后,它现在全部可用。

在完整的documentation可用之前,请参阅examples文件夹或代码文档 以了解有关pero库功能的更多信息。

importperoimg=pero.Image(width=200,height=200)img.line_cap=pero.ROUNDimg.line_join=pero.ROUND# fillimg.fill_color=pero.colors.Whiteimg.fill()# bodyimg.line_width=2img.line_color=pero.colors.Orange.darker(.1)img.fill_color=pero.colors.Orangeimg.draw_circle(100,100,75)# shadowimg.line_color=Noneimg.fill_color=pero.colors.White.darker(.1)img.draw_ellipse(100,185,70,10)# eyesimg.fill_color=pero.colors.Blackimg.draw_circle(70,85,15)img.draw_circle(130,85,15)# eyebrowsimg.line_color=pero.colors.Blackimg.fill_color=Noneimg.line_width=3img.draw_arc(70,85,23,pero.rads(-100),pero.rads(-20))img.draw_arc(130,85,23,pero.rads(200),pero.rads(280))# mouthimg.line_width=5img.draw_arc(100,100,50,pero.rads(40),pero.rads(80))# highlightimg.line_color=pero.colors.Orange.lighter(.3)img.draw_arc(100,100,68,pero.rads(220),pero.rads(260))# hatpath=pero.Path(pero.WINDING)path.ellipse(100,27,40,10)path.ellipse(100,17,30,10)path.rect(85,17,30,10)mat=pero.Matrix().rotate(pero.rads(20),100,100)path.transform(mat)img.line_color=Noneimg.fill_color=pero.colors.Blackimg.draw_path(path)# show imageimg.show()

Final Image

要求

安装

pero库完全用python实现。不需要额外的编译器。下载源代码后 代码只需在pero文件夹中运行以下命令:

$ python setup.py install

或者简单地使用pip

$ pip install pero

免责声明

这个程序的发布是希望它会有用,但是没有任何保证;甚至没有隐含的 为特定目的提供适销性或适合性的保证。

请注意,pero库仍处于alpha状态。它的api可能会发生任何变化。

示例

使用默认后端

如果您只想使用默认后端(对于请求的格式)绘制图像,或显示图像 直接(需要wxpython或pythonista),只需创建一个图像并将其用作任何其他pero画布:

importpero# init sizewidth=200height=200# init imageimg=pero.Image(width=width,height=height)# draw graphicsimg.line_color="b"img.fill_color="w"img.fill()img.draw_circle(100,100,75)# save to fileimg.export('image.png')# show in viewerimg.show()

使用pyqt5

qwidget中,您可以创建一个qpainter并将其封装到pero画布中:

importperofromPyQt5.QtGuiimportQPainter# init sizewidth=200height=200# init painterqp=QPainter()qp.begin(self)qp.setRenderHint(QPainter.Antialiasing)# init canvascanvas=pero.qt.QtCanvas(qp)# draw graphicscanvas.line_color="b"canvas.fill_color="w"canvas.fill()canvas.draw_circle(100,100,75)# end drawingqp.end()

使用wxpython

wxapp中,您可以使用任何所需的wxdc并将其封装到pero画布中:

importperoimportwx# init sizewidth=200height=200# create DCbitmap=wx.Bitmap(width,height)dc=wx.MemoryDC()dc.SelectObject(bitmap)# use GCDCif'wxMac'notinwx.PlatformInfo:dc=wx.GCDC(dc)# init canvascanvas=pero.wx.WXCanvas(dc,width=width,height=height)# draw graphicscanvas.line_color="b"canvas.fill_color="w"canvas.fill()canvas.draw_circle(100,100,75)

使用pycairo

根据最终的图像格式,选择适当的cairosurface,获取绘图上下文并将其封装到 pero画布:

importperoimportcairo# init sizewidth=200height=200# create cairo drawing contextsurface=cairo.PSSurface('image.eps',width,height)dc=cairo.Context(surface)# init canvascanvas=pero.cairo.CairoCanvas(dc,width=width,height=height)# draw graphicscanvas.line_color="b"canvas.fill_color="w"canvas.fill()canvas.draw_circle(100,100,75)# save to filedc.show_page()

使用pymupdf

创建文档,添加新页面并将其封装到pero画布:

importperoimportfitz# init sizewidth=200height=200# init documentdoc=fitz.open()page=doc.newPage(width=width,height=height)# init canvascanvas=pero.mupdf.MuPDFCanvas(page)# draw graphicscanvas.line_color="b"canvas.fill_color="w"canvas.fill()canvas.draw_circle(100,100,75)# save to filedoc.save('image.pdf')doc.close()

使用svg

pero库实现了自己的绘制和保存svg文件的方法,只需创建一个pero画布:

importpero# init sizewidth=200height=200# init canvascanvas=pero.svg.SVGCanvas(width=width,height=height)# draw graphicscanvas.line_color="b"canvas.fill_color="w"canvas.fill()canvas.draw_circle(100,100,75)# save to filewithopen('test.svg','w',encoding='utf-8')asf:f.write(canvas.get_xml())

使用pythonista

初始化一个新的ui.imagecontext并创建一个pero画布:

importperoimportui# init sizewidth=200height=200# open contextwithui.ImageContext(width,height)asctx:# init canvascanvas=pero.pythonista.UICanvas(width=width,height=height)# draw graphicscanvas.line_color="b"canvas.fill_color="w"canvas.fill()canvas.draw_circle(100,100,75)# show imageimg=ctx.get_image()img.show()

使用字形和动态属性

d3jsjavascript库类似,预构建pero.glyphs对象的大多数属性可以 指定为函数,自动向其提供给定的数据源。加上pero.scales(也许 ^ {EM1}$PARO.轴)这可以用来简单地绘制简单的图。

importperoimportnumpy# init sizewidth=400height=300padding=50# init datax_data=numpy.linspace(-numpy.pi,numpy.pi,50)y_data=numpy.sin(x_data)# init scalesx_scale=pero.LinScale(in_range=(min(x_data),max(x_data)),out_range=(padding,width-padding))y_scale=pero.LinScale(in_range=(-1,1),out_range=(height-padding,padding))color_scale=pero.GradientScale(in_range=(-1,1),out_range=pero.colors.Spectral)# init markermarker=pero.Circle(size=8,x=lambdad:x_scale.scale(d[0]),y=lambdad:y_scale.scale(d[1]),line_color=lambdad:color_scale.scale(d[1]).darker(.2),fill_color=lambdad:color_scale.scale(d[1]))# init imageimage=pero.Image(width=width,height=height)# fillimage.fill_color=pero.colors.Whiteimage.fill()# draw pointsforpinzip(x_data,y_data):marker.draw(image,source=p)# show imageimage.show()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
接收com。太阳媒体声音Java中来自MIDI控制器的FastShortMessage,如何解码?   JAVA日志记录:当日志文件将要滚动时,应用程序将暂停   java如何使用循环来重复函数选择   java OpenJPA和存储过程,Weblogic 12c   编码风格什么是正确的方式来使用。Java中的equals方法?   通过tcpsocket将xml从java发送到C#   java对象比JTable效率更高   java在运行时删除标志\半透明\状态   java将一个数均匀随机地分成m个部分   链表的Java数组   javajaxws:在数据库中记录请求和响应   java maven,执行标记,缺少id标记   泛型类中的java泛型转换