wx.listctrl- insertstringitem not working

barronmo barronmo at gmail.com
Fri Nov 9 17:07:58 EST 2007


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




More information about the Python-list mailing list