从临时文件加载的字体文件似乎不正确

时间:2014-09-15 20:05:16

标签: python pygame

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:无法在流中搜索。 使用下面的代码,它完美地工作。有人请解释如何使用临时文件方法获取字体而不是写入文件。这可能吗?

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()

1 个答案:

答案 0 :(得分:2)

当临时关闭时,它会被销毁,因此您无法从中读取以提取字体数据。

您的代码在哪一行得到RuntimeError: Can't seek in stream错误消息?正如Michael Petch所说,我们需要了解您的操作系统。 tempfile.TemporaryFile()当然可以在Linux上搜索。

BTW,

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

temp.close()位于if区块内。我猜这可能只是一个副本&粘贴错误。但正如我上面所说,你想要关闭这些文件,直到你从中读取它们为止。

据推测,您的原始字体读取功能会使用文件名从磁盘打开字体文件,然后使用open()中的文件句柄访问字体数据。正如Michael Petch所说,你需要改变它以接受已经打开的文件的句柄。

修改

当你说'#34;没有其他字体阅读功能"之前我感到很困惑,因为我无法弄清楚你实际上是想用解密的字体数据做什么。

我想我也因为调用字体提取函数main()而感到困惑,因为main()通常用作程序的入口点,所以程序通常不会运行在不同的模块中有许多不同的main()函数。

总之...

我从未使用过pygame,但是通过快速查看the docs,你可以给pygame.font.Font()一个字体名称字符串或一个打开的字体文件句柄作为第一个arg,例如

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

据推测,您的fnt模块有一个包含两串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)