Tkinter、asksaveasfile 和 unicode

The*_*niz 2 python unicode tkinter python-3.x

长话短说,我正在制作一个将一大堆 Unicode 写入文件的程序。它通过使用 Tkinterasksaveasfile对话框让用户选择他们想要保存它的位置来做到这一点。这里是有问题的片段(顺便说一句,我进口tkinter.filedialogfudder只是为了好玩。):

name = fudder.askopenfilename(defaultextension =("Python Files","*.py"),title = "Choose a file to encrypt.")
with open(name,'r') as Usefile:
    filecont = Usefile.read()
    if filecont is None:
        return
    else:
        result = crypt(filecont)
        with fudder.asksaveasfile(mode = 'w', defaultextension = '.txt', title = 'Save the decrypted file.') as newf:
            if result is None:
                return
            else:
                newf.write(result[0].encode('utf-8'))
                newf.write('\n\n\nKey:\n\n\n')
                newf.write(result[1].encode('utf-8'))
                newf.close()
Run Code Online (Sandbox Code Playgroud)

我看了几个像这样的问题,但没有一个专门解决这个问题。该asksaveasfile对话框的工作方式与open函数一样,但我无法指定编码。我尝试将其编码为字节,但您只能将字符串写入文件,并且不能将字节转换为字符串,然后再将其转换回字节。

Ter*_*edy 5

我检查了代码asksaveasfile,确实它只通过文件名和模式打开。严格来说,它是一个方便的函数,将调用 toasksaveasfilename与调用相结合open(filename, mode),默认所有其他参数。所以不要使用它。

相反,asksaveasfilename您自己使用并显式打开文件,就像您为源文件所做的那样。然后,您可以编写您想要的开放调用,encoding='utf-8'以及任何其他非默认选项。

第一个with应该在您阅读Usefile并不再需要它后结束。if因此,该语句应被删除。