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
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