我正在尝试用Python的ctypes包装librsvg的基本功能,但我得到了一个段错误.
C:
// pycairo excerpt
typedef struct {
PyObject_HEAD
cairo_t *ctx;
PyObject *base; /* base object used to create context, or NULL */
} PycairoContext;
// librsvg excerpt
RsvgHandle * rsvg_handle_new_from_file (const gchar * file_name, GError ** error);
// ...
gboolean rsvg_handle_render_cairo (RsvgHandle * handle, cairo_t * cr);
Run Code Online (Sandbox Code Playgroud)
Python ctypes:
from ctypes import *
from ctypes import util
librsvg = cdll.LoadLibrary('/brew/lib/librsvg-2.2.dylib')
libgobject = cdll.LoadLibrary('/brew/lib/libgobject-2.0.dylib')
libgobject.g_type_init()
class RSVGDimensionData(Structure):
_fields_ = (
('width', c_int),
('height', c_int),
('em', c_double),
('ex', c_double)
)
class …Run Code Online (Sandbox Code Playgroud) 我正在创建一个用于数据可视化的小工具.GUI是使用Pygtk创建的,非常简单.在用户输入文件名后,他可以按"calc"按钮查看输出.输出由pycairo呈现并呈现在gtk.DrawingArea中.
该应用程序的工作原理如下:按下该按钮时,将处理该文件,并将其内容存储在特殊类中.这个类是一个自定义容器:它与gui一起实例化,无论是空的还是填充的.DrawingArea的expose事件链接到一个绘图函数,该函数读取容器并绘制其内容.只要容器为空,DrawingArea就会为空,但在点击calc并加载文件之后,应该用我的视觉效果填充DrawingArea.
问题是:除了更新DrawingArea之外,一切正常.我无法弄清楚如何手动调用曝光.按下calc后我必须调整窗口大小才能看到结果.
更具体一点:我从教程中复制了这段代码,不知道如何自己提供参数事件:
def do_expose_event(self,event):
# Create the cairo context
cr = self.window.cairo_create()
# Restrict Cairo to the exposed area; avoid extra work
cr.rectangle(event.area.x, event.area.y,
event.area.width, event.area.height)
cr.clip()
self.draw(cr, *self.window.get_size())
Run Code Online (Sandbox Code Playgroud) 运行pip install时,我遇到这样的错误:
$ pip install pycairo
Downloading/unpacking pycairo
You are installing a potentially insecure and unverifiable file. Future versions of pip will default to disallowing insecure files.
Downloading pycairo-1.10.0.tar.bz2 (246kB): 246kB downloaded
Running setup.py egg_info for package pycairo
Traceback (most recent call last):
File "<string>", line 16, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/home/naught101/.virtualenvs/virtualenv-3/build/pycairo/setup.py'
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 16, in <module>
FileNotFoundError: [Errno 2] No …Run Code Online (Sandbox Code Playgroud) 我已经使用图形工具库有一段时间了,到目前为止我还没有真正使用过它的大部分绘图功能。今天,当尝试使用graph_tool.draw.graph_draw时,我意识到我最初配置的 graph-tool 没有cairo,
./configure --disable-cairo
Run Code Online (Sandbox Code Playgroud)
这正是 graph_draw 使用的图形库。如果我现在安装 cairo,有没有办法激活依赖 cairo 的 graph_tool 功能,而无需删除并重新安装整个 graph_tool 模块?这将节省几个小时的重新安装时间。(在我的机器上制作过程大约需要 3 个小时)。
我无法理解如何使用pyCairo简单地旋转图像......
基于这个例子,这就是我所做的:
image_surface = cairo.ImageSurface.create_from_png(image_path)
width = image_surface.get_width()
height = image_surface.get_height()
context = cairo.Context(cairo.ImageSurface (cairo.FORMAT_ARGB32, width, height))
context.translate(width*0.5, height*0.5)
context.rotate(45.0*math.pi/180.0)
context.scale(1.0, 1.0)
context.translate(-width*0.5, -height*0.5)
context.set_source_surface(image_surface, 0, 0)
context.paint()
image_surface.write_to_png(output_path)
Run Code Online (Sandbox Code Playgroud)
输出图像与初始图像相同.我错过了什么?
matplotlib在编译依赖于和pyside2with 的应用程序时,pyinstaller我收到这些错误
环境
PyInstaller: 3.5
Python: 3.7.5
Platform: Windows-10-10.0.14393-SP0
Run Code Online (Sandbox Code Playgroud)
错误
31256 INFO: Matplotlib backend GTK3Agg: ignored
Traceback (most recent call last):
File c:\users\digikwondo\pycharmprojects\guitest\venv\lib\site-
packages\matplotlib\backends\backend_cairo.py, line 14, in <module>
import cairo
ModuleNotFoundError: No module named cairo
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 12, in <module>
File "c:\users\digikwondo\pycharmprojects\guitest\venv\lib\site-
packages\matplotlib\backends\backend_gtk3agg.py, line 4, in <module>
from . import backend_agg, backend_cairo, backend_gtk3
File "c:\users\digikwondo\pycharmprojects\guitest\venv\lib\site-
packages\matplotlib\backends\backend_cairo.py", line 20, in <module> …Run Code Online (Sandbox Code Playgroud) 所以我有 venv 我想使用尚未安装的 pycairo 模块
(venv) command$ python -m pip install pycairo
Collecting pycairo
Using cached https://files.pythonhosted.org/packages/3c/1a/c0478ecab31baae50fda9956547788afbd0ca563adc52c9b03cab30f17eb/pycairo-1.18.2.tar.gz
Installing collected packages: pycairo
Running setup.py install for pycairo ... error
Complete output from command /home/user/Code/manim/venv/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-gtt_9z57/pycairo/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-9arnuyr8/install-record.txt --single-version-externally-managed --compile --install-headers /home/user/Code/manim/venv/include/site/python3.7/pycairo:
running install
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.7
creating build/lib.linux-x86_64-3.7/cairo
copying cairo/__init__.py -> build/lib.linux-x86_64-3.7/cairo
copying cairo/__init__.pyi -> build/lib.linux-x86_64-3.7/cairo
copying cairo/py.typed -> build/lib.linux-x86_64-3.7/cairo
running build_ext
Package cairo was not …Run Code Online (Sandbox Code Playgroud) 出于某种原因,我无法让python找到cairo.
当我做./waf配置我得到了
Setting top to : /home/user/pycairo/py2cairo-1.10.0
Setting out to : /home/user/pycairo/py2cairo-1.10.0/build_directory
./configure()
Checking for 'gcc' (c compiler) : ok
Checking for program python : /usr/bin/python
Checking for python version : (2, 7, 2, 'final', 0)
Checking for library python2.7 : yes
Checking for program python2.7-config : /usr/bin/python2.7-config
Checking for header Python.h : yes
Checking for program pkg-config : /usr/bin/pkg-config
Checking for 'cairo' >= 1.10.0 : yes
Configuration:
PREFIX : /usr/local
LIBDIR : /usr/local/lib
Run Code Online (Sandbox Code Playgroud)
接下来我跑了./waf install.
试着
import cairo
ImportError: …Run Code Online (Sandbox Code Playgroud) 我是 python3 的新手。我已经创建了虚拟环境。我尝试使用 pip 命令安装 pycairo 包。我需要安装 python cairo。请参阅以下信息
pip install git+http://anongit.freedesktop.org/git/pycairo
Downloading/unpacking git+http://anongit.freedesktop.org/git/pycairo
Cloning http://anongit.freedesktop.org/git/pycairo to /tmp/pip-0c_foz-build
Running setup.py egg_info for package from git+http://anongit.freedesktop.org/git/pycairo
cairo >= 1.10.2 Successful
Installing collected packages: pycairo
Running setup.py install for pycairo
cairo >= 1.10.2 Successful
building 'cairo._cairo' extension
gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/python3.2mu -c src/cairomodule.c -o build/temp.linux-i686-3.2/src/cairomodule.o
src/cairomodule.c:22:20: fatal error: Python.h: No such file or directory
compilation terminated.
error: command 'gcc' failed …Run Code Online (Sandbox Code Playgroud) 我创建了一个 Gtk.grid,其中包含一堆可在网格周围调整大小和拖动的按钮。
我还创建了一个 Gtk.drawingarea 来绘制网格线。我想让我的按钮像这样透明:
Gtk.Button.set_property("opacity", 0.3)
Run Code Online (Sandbox Code Playgroud)
这成功地使按钮透明;但是,它不允许我看到按钮后面的线条网格。
我知道我用 Gtk.Overlay 小部件正确地覆盖了它们,因为不直接在按钮后面的部分线被正确显示。
我的问题是,我怎样才能看到透明按钮后面的其余绘图区域?我尝试将容器设置为透明,设置 Gdk.Window 透明度,但没有任何效果。这只是 Gtk3 无法实现的吗?
pycairo ×10
python ×8
cairo ×6
python-3.x ×2
ctypes ×1
graph-tool ×1
gtk ×1
gtk3 ×1
librsvg ×1
pip ×1
pygobject ×1
pygtk ×1
pyinstaller ×1
windows ×1