wx.listctrl- insertstringitem not working

B

barronmo

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
 
K

kyosohma

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
 
L

Larry Bates

barronmo said:
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

You probably will want to post over at gmane.comp.python.wxpython. A lot more
wx people (including wxPython author) over there.

-Larry
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,046
Latest member
Gavizuho

Latest Threads

Top