今天在使用Python的GUI平台wxPython时,写了一个只有打开、编辑、保存功能的简易笔记本,代码如下:
1 #coding:utf-8 2 import wx 3 4 def load(event): 5 f = open(FileName.GetValue()) 6 Contents.SetValue(f.read().decode('utf-8')) 7 f.close() 8 9 def save(event): 10 f = open(FileName.GetValue(), 'w') 11 f.write(Contents.GetValue()) 12 f.close() 13 14 app = wx.App() 15 win = wx.Frame(None, title = "Simple Editor", size = (410, 335)) 16 bkg = wx.Panel(win) 17 18 LoadButton = wx.Button(bkg, label = "Open") 19 LoadButton.Bind(wx.EVT_BUTTON, load) 20 SaveButton = wx.Button(bkg, label = "Save") 21 SaveButton.Bind(wx.EVT_BUTTON, save) 22 FileName = wx.TextCtrl(bkg) 23 Contents = wx.TextCtrl(bkg, style = wx.TE_MULTILINE | wx.HSCROLL) 24 25 hbox = wx.BoxSizer() 26 hbox.Add(FileName, proportion = 1, flag = wx.EXPAND) 27 hbox.Add(LoadButton, proportion = 0, flag = wx.LEFT, border = 5) 28 hbox.Add(SaveButton, proportion = 0, flag = wx.LEFT, border = 5) 29 30 vbox = wx.BoxSizer(wx.VERTICAL) 31 vbox.Add(hbox, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 5) 32 vbox.Add(Contents, proportion = 1, flag = wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT, 33 border = 5) 34 35 bkg.SetSizer(vbox) 36 win.Show() 37 38 app.MainLoop()
但是在使用过程中输入中文保存时,控制台报错:
Traceback (most recent call last):
File "D:coding_filepython_fileTestPythonsrcTest est1.py", line 11, in save
f.write(Contents.GetValue())
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
这里需要特别注意第六行代码中的 f.read().decode('utf-8'),因为字符串在Python内部的表示是Unicode编码,所以使用decode('utf-8'),表示用utf-8编码对文件进行解码,从而将文件中的字符串转换为Unicode编码。
由于Python默认使用Unicode编码,所以需要手动设置编码如utf-8,改动如下:
1 import wx, sys 2 reload(sys) 3 sys.setdefaultencoding('utf-8')
这样就可以输入中文并保存了,其中要特别注意 reload(sys) 这一行代码
reload()函数将以前导入过的模块再加载一次。重新加载(reload)包括最初导入模块时应用的分析过程和初始化过程。这样就允许在不退出解释器的情况下重新加载已更改的Python模块,从而改变字符集编码为UTF-8,问题解决。