Файл шрифта, загруженный из временного файла, кажется неправильным

for key in fnt.keys(): str1 = base64.b64decode(fnt[key]) strA = XOR(str1, coder) temp = tempfile.TemporaryFile() temp.seek(0) temp.write(strA) temp.seek(0) if key == "calibri.ttf": FONT = temp if key == "calibrib.ttf": FONTB = temp temp.close() return (FONT, FONTB) 

В приведенном выше коде я получил шрифты, сохраненные в виде строки в словаре. Когда я использую этот код, он возвращает ошибку – RuntimeError: не может искать в потоке. С приведенным ниже кодом он отлично работает. Кто-нибудь, пожалуйста, объясните, как использовать метод temp file для получения шрифтов, а не записи в файл. Это возможно?

 for key in fnt.keys(): str1 = base64.b64decode(fnt[key]) strA = XOR(str1, coder) with open(home + "\\" + key, "wb") as to_disk: to_disk.write(strA) FONT = "calibri.ttf" FONTB = "calibrib.ttf" return (FONT, FONTB) 

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

 import string import base64 import os from fnt import fnt import string import tempfile from itertools import cycle, izip def XOR(message, key): cryptedMessage = ''.join(chr(ord(c)^ord(k)) for c,k in izip(message, cycle(key))) return cryptedMessage #---------------------------------------------------------------------- def main(): """extracts and returns the font files from fnt.py""" coder ="PHdzDER+@k7pcm!LX8gufh=y9A^UaMsn-oW6" home = os.getcwd() for key in fnt.keys(): str1 = base64.b64decode(fnt[key]) strA = XOR(str1, coder) #temp = tempfile.TemporaryFile() #temp.seek(0) #temp.write(strA) #temp.seek(0) #if key == "calibri.ttf": #FONT = temp #if key == "calibrib.ttf": #FONTB = temp with open(home + "\\" + key, "wb") as to_disk: to_disk.write(strA) FONT = "calibri.ttf" FONTB = "calibrib.ttf" return (FONT, FONTB) if __name__=='__main__': main() 

One Solution collect form web for “Файл шрифта, загруженный из временного файла, кажется неправильным”

Когда temp закрыт, он уничтожается, поэтому вы не сможете прочитать его, чтобы извлечь данные шрифта.

На какой строке вашего кода вы получаете RuntimeError: Can't seek in stream сообщение об ошибке RuntimeError: Can't seek in stream ? Как сказал Майкл Пётч, нам нужно знать вашу ОС. tempfile.TemporaryFile (), безусловно, доступен для Linux.

BTW, в

 if key == "calibrib.ttf": FONTB = temp temp.close() 

temp.close() находится внутри блока if . Я думаю, это может быть просто ошибка копирования и вставки. Но, как я сказал выше, вы не хотите закрывать эти файлы, пока не прочитаете их.

Предположительно, ваша исходная функция чтения шрифтов открывает файлы шрифтов с диска с именами файлов, а затем обращается к данным шрифта, используя дескриптор файла из open() . Так, как сказал Майкл Петч, вам нужно изменить это, чтобы принимать дескрипторы из уже открытых файлов.

РЕДАКТИРОВАТЬ

Я запутался раньше, когда вы сказали, что «Нет никакой другой функции чтения шрифтов», поскольку я не мог понять, что вы на самом деле пытались сделать с дешифрованными данными шрифта.

И я думаю, что я тоже смутился тем, что вы вызываете функцию выделения шрифта main() , поскольку main () обычно используется в качестве точки входа в программу, поэтому программа обычно не запускает кучу различных функций main() в разных модулях.

Так или иначе…

Я никогда не пользовался pygame, но из быстрого просмотра документов вы можете дать pygame.font.Font() либо строку имени шрифта, либо открытую ручку файла шрифта в качестве первого аргумента, например

myfont = pygame.font.Font(font_filehandle, size)

Предположительно, ваш модуль fnt имеет dict, содержащий две строки закодированных base64, XOR-зашифрованных данных шрифта, с именами шрифтов, «calibrib.ttf».

Так что это должно сработать, предполагая, что я не понимаю, что это pygame doc. 🙂

Предупреждение: непроверенный код

 def xor_str(message, key): return ''.join([chr(ord(c)^ord(k)) for c,k in izip(message, cycle(key))]) def decode_fonts(fnt): coder = "PHdzDER+@k7pcm!LX8gufh=y9A^UaMsn-oW6" font_fh = {} for key in fnt.keys(): xorfont = base64.b64decode(fnt[key]) temp = tempfile.TemporaryFile() temp.write(xor_str(xorfont, coder)) temp.seek(0) font_fh[key] = temp return font_fh #............... #In your pygame function: font_fh = decode_fonts(fnt) font_obj = {} for key in font_fh.keys(): font_obj[key] = pygame.font.Font(font_fh[key], point_size) #Now you can do surface = font_obj["calibri.ttf"].render(text, antialias, color, background=None) 
  • Решение «Ошибка загрузки DLL:% 1 не является допустимым приложением Win32». Для Pygame
  • Полностью прозрачные окна в Pygame?
  • pygame.error: нет доступного видеоустройства
  • pyGame в приложении pyGTK
  • столкновение с пигмеем
  • Любой способ ускорить Python и Pygame?
  • Невозможно установить pygame с пипсом, поскольку есть ошибка при запуске runvsetup.py bdist_wheel для pygame
  • Как добавить текст в прямоугольник pygame
  • Ошибка Pygame: видеосистема не инициализирована
  • Как повернуть изображение вокруг его центра с помощью Pygame?
  • Ошибка атрибута: член не определен python
  • Python - лучший язык программирования в мире.