wx.listctrl- insertstringitem not working

kyosohma at gmail.com kyosohma at gmail.com
Fri Nov 9 17:25:12 EST 2007


On Nov 9, 4:07 pm, barronmo <barro... at gmail.com> wrote:
> Newbie with problem.  I'm trying to build a multicolumn list control
> with wxPython and am having difficulty getting the data from my query
> into each column.  I'm getting the following error:
>
> Traceback (most recent call last):
>   File "/home/mb/PyPrograms/EMRGUI/Selectable.py", line 115, in
> <module>
>     Repository(None, -1, 'Repository')
>   File "/home/mb/PyPrograms/EMRGUI/Selectable.py", line 57, in
> __init__
>     index = self.list.InsertStringItem(sys.maxint, i['patient_ID'])
>   File "/usr/lib/python2.5/site-packages/wx-2.8-gtk2-unicode/wx/lib/
> mixins/listctrl.py", line 751, in __InsertStringItem_
>     index = self.InsertImageStringItem(index, label, 0)
>   File "/usr/lib/python2.5/site-packages/wx-2.8-gtk2-unicode/wx/
> _controls.py", line 4716, in InsertImageStringItem
>     return _controls_.ListCtrl_InsertImageStringItem(*args, **kwargs)
> TypeError: String or Unicode type required
>
> The code I'm using is based on the wxPython tutorial at Zetcode:
>
> #!/usr/bin/python
>
> import wx
> import sys
> import MySQLdb
> from wx.lib.mixins.listctrl import CheckListCtrlMixin,
> ListCtrlAutoWidthMixin
>
> conn = MySQLdb.connect(host = "localhost",
>           user = "root",
>           passwd = "Barron85",
>           db = "meds")
>
> def name_find(namefrag):
>
>      cursor = conn.cursor(MySQLdb.cursors.DictCursor)
>      cursor.execute("SELECT patient_ID, firstname, lastname,
> phonenumber, SSN, \
>                         DOB FROM demographics WHERE lastname LIKE '%s%%'" % (namefrag))
>
>      results = cursor.fetchall()
>      results_list = list(results)
>      return results_list
>      cursor.close()
>
> class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin,
> ListCtrlAutoWidthMixin):
>     def __init__(self, parent):
>         wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT |
> wx.SUNKEN_BORDER)
>         CheckListCtrlMixin.__init__(self)
>         ListCtrlAutoWidthMixin.__init__(self)
>
> class Repository(wx.Frame):
>     def __init__(self, parent, id, title):
>         wx.Frame.__init__(self, parent, id, title, size=(850, 400))
>
>         panel = wx.Panel(self, -1)
>
>         vbox = wx.BoxSizer(wx.VERTICAL)
>         hbox = wx.BoxSizer(wx.HORIZONTAL)
>
>         leftPanel = wx.Panel(panel, -1)
>         rightPanel = wx.Panel(panel, -1)
>
>         self.log = wx.TextCtrl(rightPanel, -1, style=wx.TE_MULTILINE)
>         self.list = CheckListCtrl(rightPanel)
>         self.list.InsertColumn(0, 'Patient ID', width=100)
>         self.list.InsertColumn(1, 'Lastname', width=200)
>         self.list.InsertColumn(2, 'Firstname', width=125)
>         self.list.InsertColumn(3, 'Phone')
>         self.list.InsertColumn(4, 'SSN')
>         self.list.InsertColumn(5, 'DOB')
>
>         patients = name_find(str(raw_input('Select the first several letters
> of the last name: ')))
>         for i in patients:
>             index = self.list.InsertStringItem(sys.maxint,
> i['patient_ID'])
>             self.list.SetStringItem(index, 1, i['lastname'])
>             self.list.SetStringItem(index, 2, i['firstname'])
>             self.list.SetStringItem(index, 3, i['phonenumber'])
>             self.list.SetStringItem(index, 4, i['SSN'])
>             self.list.SetStringItem(index, 5, i['DOB'])
>
>         vbox2 = wx.BoxSizer(wx.VERTICAL)
>
>         sel = wx.Button(leftPanel, -1, 'Select All', size=(100, -1))
>         des = wx.Button(leftPanel, -1, 'Deselect All', size=(100, -1))
>         apply = wx.Button(leftPanel, -1, 'Apply', size=(100, -1))
>
>         self.Bind(wx.EVT_BUTTON, self.OnSelectAll, id=sel.GetId())
>         self.Bind(wx.EVT_BUTTON, self.OnDeselectAll, id=des.GetId())
>         self.Bind(wx.EVT_BUTTON, self.OnApply, id=apply.GetId())
>
>         vbox2.Add(sel, 0, wx.TOP, 5)
>         vbox2.Add(des)
>         vbox2.Add(apply)
>
>         leftPanel.SetSizer(vbox2)
>
>         vbox.Add(self.list, 1, wx.EXPAND | wx.TOP, 3)
>         vbox.Add((-1, 10))
>         vbox.Add(self.log, 0.5, wx.EXPAND)
>         vbox.Add((-1, 10))
>
>         rightPanel.SetSizer(vbox)
>
>         hbox.Add(leftPanel, 0, wx.EXPAND | wx.RIGHT, 5)
>         hbox.Add(rightPanel, 1, wx.EXPAND)
>         hbox.Add((3, -1))
>
>         panel.SetSizer(hbox)
>
>         self.Centre()
>         self.Show(True)
>
>     def OnSelectAll(self, event):
>         num = self.list.GetItemCount()
>         for i in range(num):
>             self.list.CheckItem(i)
>
>     def OnDeselectAll(self, event):
>         num = self.list.GetItemCount()
>         for i in range(num):
>             self.list.CheckItem(i, False)
>
>     def OnApply(self, event):
>         num = self.list.GetItemCount()
>         for i in range(num):
>             if i == 0: self.log.Clear()
>             if self.list.IsChecked(i):
>                 self.log.AppendText(self.list.GetItemText(i) + '\n')
>
> app = wx.App()
> Repository(None, -1, 'Repository')
> app.MainLoop()
>
> If you see what I'm doing wrong I'd be grateful for any help.
>
> Mike

It sounds like you've got something that's been returned from the SQL
query that isn't a string.  Most likely it's the phone number, the DOB
or the SSN. You'll need to cast any or all of those as strings BEFORE
inserting them into the listctrl.

Something like this:

<untested>

self.list.SetStringItem(index, 3, str(i['SSN'])

If that doesn't help, post to the wxPython group found here:

http://www.wxpython.org/maillist.php

Mike




More information about the Python-list mailing list