How to pass UTF-8 string from wx.TextCtrl to wx.ListCtrl
문제
If I enter Baltic characters in textctrl and click button test1 I have an error
"InicodeEncodeError: 'ascii' codec can't encode characters in position 0-3:
ordinal not in range(128)"
Button test2 works fine.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, (-1, -1), wx.Size(450, 300))
self.panel = wx.Panel(self)
self.input_area = wx.TextCtrl(self.panel, -1, '',(5,5),(200,200), style=wx.TE_MULTILINE)
self.output_list = wx.ListCtrl(self.panel, -1, (210,5), (200,200), style=wx.LC_REPORT)
self.output_list.InsertColumn(0, 'column')
self.output_list.SetColumnWidth(0, 100)
self.btn1 = wx.Button(self.panel, -1, 'test1', (5,220))
self.btn1.Bind(wx.EVT_BUTTON, self.OnTest1)
self.btn2 = wx.Button(self.panel, -1, 'test2', (100,220))
self.btn2.Bind(wx.EVT_BUTTON, self.OnTest2)
self.Centre()
def OnTest1(self, event):
self.output_list.InsertStringItem(0,str(self.input_area.GetValue()).decode('utf-8'))
def OnTest2(self, event):
self.output_list.InsertStringItem(0,"ąčęėįš".decode('utf-8'))
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'encoding')
frame.Show(True)
return True
app = MyApp(0)
app.MainLoop()
Update 1
I have tried this code on two Windows 7 Ultimate x64 computers.
Both have python 2.7 and wxPython2.8 win64 unicode for python 2.7
In both machines I have the same error.
해결책
Replace def OnTest1(self, event): self.output_list.InsertStringItem(0,str(self.input_area.GetValue()).decode('utf-8'))
with
def OnTest1(self, event):
self.output_list.InsertStringItem(0,self.input_area.GetValue())
다른 팁
can't reproduce... If I try with swedish caracters "åäö" it seems to work, also when using "ąčęėįš" locale problem?
Are you using the unicode build of wxPython? You didn't mention your platform and other system details.
제휴하지 않습니다 StackOverflow