Помещение изображений .SVG в tkinter FramePython

Программы на Python
Ответить
Anonymous
 Помещение изображений .SVG в tkinter Frame

Сообщение Anonymous »

Я пытался поместить изображение из https://betacssjs.chesscomfiles.com/bun ... 87b3f2.svg в фрейм Tkinter. Из сообщения здесь я узнал, что это возможно с помощью rsvg и cairo.

Я использовал Python 3.6 в Windows 10. Я получил rsvg отсюда и cairo отсюда, а затем извлек папки в папку «C:\Users...\site_packages». Они импортируют нормально, но я не могу понять, как их использовать. Я попробовал использовать код:

Код: Выделить всё

import tkinter as tk
main=tk.Tk()
frame=tk.Frame(main)
def svgPhotoImage(self,file_path_name):
from PIL import Image,ImageTk
import rsvg,cairo
svg = rsvg.Handle(file=file_path_name)
width, height = svg.get_dimension_data()[:2]
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, int(width), int(height))
context = cairo.Context(surface)
#context.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
svg.render_cairo(context)
tk_image=ImageTk.PhotoImage('RGBA')
image=Image.frombuffer('RGBA',(width,height),surface.get_data(),'raw','BGRA',0,1)
tk_image.paste(image)
return(tk_image)
tk_image=self.svgPhotoImage(filename)
frame.configure(image=tk_image)
и

Код: Выделить всё

#rsvg.py
import os
try:
import rsvg
WINDOWS=False
except ImportError:
print"Warning, could not import 'rsvg'"
if os.name == 'nt':
print "Detected windows, creating rsvg."
#some workarounds for windows

from ctypes import *

l=CDLL('librsvg-2-2.dll')
g=CDLL('libgobject-2.0-0.dll')
g.g_type_init()

class rsvgHandle():
class RsvgDimensionData(Structure):
_fields_ = [("width", c_int),
("height", c_int),
("em",c_double),
("ex",c_double)]

class PycairoContext(Structure):
_fields_ = [("PyObject_HEAD", c_byte * object.__basicsize__),
("ctx", c_void_p),
("base", c_void_p)]

def __init__(self, path):
self.path = path
error = ''
self.handle = l.rsvg_handle_new_from_file(self.path,error)

def get_dimension_data(self):
svgDim = self.RsvgDimensionData()
l.rsvg_handle_get_dimensions(self.handle,byref(svgDim))
return (svgDim.width,svgDim.height)

def render_cairo(self, ctx):
ctx.save()
z = self.PycairoContext.from_address(id(ctx))
l.rsvg_handle_render_cairo(self.handle, z.ctx)
ctx.restore()

class rsvgClass():
def Handle(self,file):
return rsvgHandle(file)

rsvg = rsvgClass()).
h = rsvg.Handle("box.svg")
s = cairo.ImageSurface(cairo.FORMAT_ARGB32, 100, 100)
ctx = cairo.Context(s)
h.render_cairo(ctx)
Попробовав эти сценарии, я продолжал получать сообщение об ошибке:

Код: Выделить всё

AttributeError: module 'rsvg' has no attribute 'Handle'
Я уверен, что сделал что-то не так в процессе, но после нескольких часов поиска так и не смог понять, как заставить это работать. Я также попробовал установить pycairo (через pip), но получил сообщение об ошибке

Код: Выделить всё

ERROR: Command "'c:\...\python36-32\python.exe' -u -c 'import setuptools, tokenize;__file__='"'"'C:\\...\\pip-install-peqhj3x1\\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 'C:\...\Temp\pip-record-jfozfbuc\install-record.txt' --single-version-externally-managed --compile" failed with error code 1 in C:\...\pip-install-peqhj3x1\pycairo\
Я понятия не имею, что теперь делать.


РЕДАКТИРОВАТЬ: мне наконец удалось получить pycairo из
https://www.lfd.uci.edu/~gohlke/pythonlibs/, и теперь он работает.
Наконец-то я получил rsvg, чтобы не выдавать мне сообщение об ошибке выше, обратившись
сюда
и получил необходимые файлы DLL отсюда
. Cairo
работает нормально, но RSVG создает пустой экран.
Я попробовал другой
7-строчный
здесь
и получил на выходе пустой файл вместо преобразованного.
Очевидно, RSVG не работает, и я думаю, что это проблема установки
(например, неправильные .dll). Помогите?


Если я пытаюсь использовать cairo и rsvg, потому что они занимают мало места и работают очень быстро; wand или какая-то другая библиотека — не вариант. Я просто хочу иметь возможность поместить файл SVG в фрейм tkinter. Если кто-нибудь знает, как правильно установить rsvg, буду признателен.

Будем очень благодарны за любую помощь.
Спасибо за любые предложения.

Подробнее здесь: https://stackoverflow.com/questions/559 ... nter-frame
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»