我正在使用Pango + Cairo(通过GObject)使用python3.7渲染文本,并想通过创建属性并将该属性附加到我的pango布局来设置字母间距。
在pango的gnome文档中,我可以看到应该有一个名为pango_attr_letter_spacing_new(自v1.6起)的函数。但是,如果运行,则会Pango.attr_letter_spacing_new出现错误:
AttributeError: 'gi.repository.Pango' object has no attribute 'attr_letter_spacing_new'
Run Code Online (Sandbox Code Playgroud)
感觉有点奇怪,因为我可以使用pango_attr_type_get_name从v1.22开始才应该提供的。
我可以通过使用标记来解决,<span letter_spacing="1234">但是我不想走这条路。
AttributeError: 'gi.repository.Pango' object has no attribute 'attr_letter_spacing_new'
Run Code Online (Sandbox Code Playgroud)
我已经能够找到enum值Pango.AttrType.LETTER_SPACING,这使我可以执行以下操作:
c = Pango.AttrClass()
c.type = Pango.AttrType.LETTER_SPACING
a = Pango.Attribute()
a.init(c)
Run Code Online (Sandbox Code Playgroud)
但是,我一直无法找到一种方法来设置它的值,这让我觉得这是错误的处理方法:|
将此插入到中Pango.AttrList,给了一个错误(不足为奇),并且下次我对Pango进行操作时使python进程出现段错误:
** (process:17183): WARNING **: 12:00:56.985: (gi/pygi-struct-marshal.c:287):pygi_arg_struct_from_py_marshal: runtime check failed: (g_type_is_a (g_type, G_TYPE_VARIANT) || !is_pointer || transfer == GI_TRANSFER_NOTHING)
Run Code Online (Sandbox Code Playgroud)
..可悲的是无处可去:(
pango.AttrLetterSpacing
Pango.AttrLetterSpacing => 'gi.repository.Pango' object has no attribute 'AttrLetterSpacing' …我正在使用最新版本的PyGTK All-in-One安装程序(2.24.2)用于Python 2.7,其中包括Cairo 1.10.8,Pango 1.29.4,PyGTK 2.24.0和PyGobject 2.28.3(我认为) .
以下代码泄漏~55 MB的内存:
import gtk
window = gtk.Window()
label = gtk.Label()
window.add(label)
window.show_all()
for _ in range(100000):
label.set_markup('Leaking memory!')
while gtk.events_pending():
gtk.main_iteration()
Run Code Online (Sandbox Code Playgroud)
注意:for循环在我的测试脚本中,所以我可以看到任务管理器中的内存消耗增加.它本质上也是我真实应用程序中发生的事情,除了标签文本每秒至少更改一次,而不是每次都重写相同的文本.
问题是label.set_markup(),每次呼叫泄漏大约0.5kB,所以我怀疑问题出在GTK或Cairo的某个地方.正如评论者指出的那样,这可能是这个错误(685959).
我尝试使用objgraph来查看是否有任何额外的Python对象与调用次数成比例显示,gtk.Label.set_markup()但没有多余的对象.接下来,调用gc.collect()没有帮助,我试着确定.Python似乎并不知道负责内存消耗的对象.
我如何找到这个内存泄漏,和/或解决它?我需要使用标记来为这个应用程序设置一些文本的样式,但我尝试使用它gtk.Label.set_text()作为一种解决方法,它也会泄漏内存.
我应该注意到这个应用程序针对Windows,因此使用PyGObject来获取GTK 3不是一个选项 - 在Windows上仍然没有GObject内省.
我制作的任何地图:
ggplot() + geom_sf()
生成预期的地图,但未正确显示度数符号,如下图所示。
这个答案中给出的答案 -地图轴标签中的度数符号不正确- 没有帮助,当我看到不同的标志时,我发布了一个单独的问题。
更改字体无济于事。
我还尝试sf在一个单独的项目中从 Github安装当前版本的(0.9) renv,但结果相同。
我在 Linux 上,Fedora 31。
复制:
library("ggplot2")
library("sf")
nc <- st_read(system.file("shape/nc.shp", package="sf"))
ggplot() +
geom_sf(data = nc)
Run Code Online (Sandbox Code Playgroud)
2019-03-15 更新
该问题并非特定于 ggplot/geom_sf;正如评论中所建议的,我遇到了同样的问题plot.new(); text(0.5,0.5, bquote(120*degree*N), cex=5)

另外,澄清一下,我没有在?X11(). 如果我在我的终端中运行fc-match Symbol,我会得到:
StandardSymbolsPS.t1:“标准符号 PS”“常规”
更新 2019-03-19
在全新的 Fedora 31 和 Fedora 32 beta 安装中得到确认。可能是 Fedora 的问题。
我尝试使用不同的语言环境(包括例如“en_US.UTF-8”或“German”)和设备(例如cairo_pdf(), cairo_ps()),结果相同。
X11.options() 将“cairo”显示为类型(将其更改为 Xlib,或者 dbcairo 不会更改结果)。
使用TestChars()dww在下面的答案中提出的函数显示如下:

但是,如果我用 knitr 编织到 pdf,我会得到大多数符号,包括°。
如果我编织到 …
我试图在Windows中从CLion运行graphviz作为库.我花了很长时间才走到这一步,我希望这是最后的障碍.当我运行程序时,我看到以下警告,没有图表
Warning: Could not load "C:\Program Files (x86)\Graphviz2.38\bin\gvplugin_pango.dll" - can't open the module
Run Code Online (Sandbox Code Playgroud)
我正在运行CLion,MinGW 3.22作为工具链.CmakeLists和main.c如下.不幸的是我无法注册graphviz论坛所以我希望这里有人可能有一些建议.到目前为止我已经尝试过 -
的CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(Learning)
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
set(GRAPHVIZ_INCLUDE_DIR "C:/Program Files (x86)/Graphviz2.38/include/graphviz")
set(GRAPHVIZ_LIB_DIR "C:/Program Files (x86)/Graphviz2.38/lib/release/lib")
set(SOURCE_FILES main.c)
include_directories("${GRAPHVIZ_INCLUDE_DIR}")
add_executable(Learning ${SOURCE_FILES})
find_library(CGRAPH_LIBRARY cgraph HINTS "${GRAPHVIZ_LIB_DIR}" REQUIRED)
find_library(GVC_LIBRARY gvc HINTS "${GRAPHVIZ_LIB_DIR}" REQUIRED)
target_link_libraries( Learning ${CGRAPH_LIBRARY} ${GVC_LIBRARY} )
Run Code Online (Sandbox Code Playgroud)
MAIN.C
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <gvc.h>
#include <cgraph.h>
int main() {
Agraph_t *graph;
Agnode_t *nodeA, *nodeB;
Agedge_t *edge1;
Agsym_t *symbol1; …Run Code Online (Sandbox Code Playgroud) 我需要 pyCairo 做的是:
我发现有人在Pango Cairo上移植了Android NDK(博客文章,源代码)。但是,我在编译他的示例项目方面还没有成功。有没有人设法做到这一点,并且可以告诉我我做错了什么?
到目前为止,这是我尝试过的:
我收到以下错误:
checking for arm-linux-eabi-gcc... arm-linux-androideabi-gcc --sysroot /cygdrive/f/android-ndk-r8b/platforms/android-9/arch-arm -fpic -ffunction-sections -funwind-tables -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -mfpu=vfp …Run Code Online (Sandbox Code Playgroud) 我在Ubuntu 12.04平台上安装Pango-1.30时遇到了问题.在./configure步骤中,我收到一条消息"无法启用任何Freetype,X11,Cairo或Win32后端.必须至少有一个后端来构建Pango".但是,我已经构建并安装了Freetype和X11,它们位于/ usr/bin中.如何通知./configure从哪里获取它们?
谢谢,Mark Allyn
我想使用 Pango 呈现文本,但找不到不使用 Cairo 的示例代码。有人可以给我一个使用 FreeType 后端的 Pango 用法的简单示例吗?这就是我认为它应该大致工作的方式,但是正如您在代码中看到的那样,有些事情我还不明白。
// context and font stuff
PangoFontMap *fontmap = pango_ft2_font_map_new();
// do I have to initialize the fontmap?
PangoContext *context = pango_font_map_create_context(fontmap);
PangoFontDescription *desc = pango_font_description_new();
pango_font_description_set_style(desc, PANGO_STYLE_NORMAL); // not bold or italic
pango_font_description_set_size(desc, 12); // 12pt font
PangoFont *font = pango_context_load_font(context, desc);
// target bitmap
FT_Bitmap bitmap;
// how do I say how big the bitmap should be? write it into the struct?
FT_Bitmap_New(&bitmap);
// text
char *text = "Hello World"; …Run Code Online (Sandbox Code Playgroud) Pango语法支持一些仅文本标记.据我所知,这并没有延伸到嵌入图像.
环顾四周,我找不到现有实施的方式,但我之前没有做过pango + cairo工作,所以我可能会错过明显的社区.
据我所知,合理的方法是分析字符串,拉出任何标签,创建cairo图像,然后相应地修改它们周围的pango布局.
它似乎也是某人之前可能做过的事情.
我特意在这些问题上寻找答案:
(另请注意我使用红宝石,这可能会影响我的选择)