Python 2.7.8 TypeError: 'unicode' objet n'est pas appelable
Je suis en cours d'exécution à une version de python 2.7.8. Je suis le stockage de titres de projet dans une base de données sqlite que j'essaie de l'importer dans une zone de liste déroulante. Lorsque j'essaie de l'importer les titres du projet à partir de la base de données sqlite et de les importer dans la zone de liste déroulante, j'obtiens cette erreur: TypeError: 'unicode' objet n'est pas appelable
Voici mon code:
main.py
from EvDB import EvDB
import wx
from ProjectsPanel import ProjectsPanel
class MyFrame(wx.Frame):
""" We simply derive a new class of Frame. """
def __init__(self, parent, ID, title):
wx.Frame.__init__(self, parent, ID, title=title, size=(650,725))
# Create Database Tables
self.db = EvDB(self)
self.db.createTbls()
main = wx.Panel(self)
self.projectsPg = ProjectsPanel(main, -1)
self.mainSizer = wx.BoxSizer(wx.VERTICAL)
self.mainSizer.Add(self.projectsPg, 1, wx.ALL|wx.EXPAND)
main.SetAutoLayout(True)
main.SetSizer(self.mainSizer)
self.mainSizer.Fit(main)
self.Layout()
self.Show()
self.UserID = 1
rows = self.db.getProjects(self.UserID)
print(rows)
print(str(rows))
self.projectsPg.cb.Value(rows)
app = wx.App(False)
ProjectsPanel.py
import wx
from EvDB import EvDB
import sqlite3 as lite
class ProjectsPanel(wx.Panel):
def __init__(self, parent, ID):
wx.Panel.__init__(self, parent, ID)
self.db = lite.connect('evDB.db')
self.cur = self.db.cursor()
self.db2 = EvDB(self)
sizer = wx.BoxSizer(wx.VERTICAL)
# the combobox Control
self.userProjects = ['Before1','Before2', 'Before3', 'Before4']
self.cb = wx.ComboBox(self, value='New', choices=self.userProjects, style=wx.CB_DROPDOWN)
sizer.Add(self.cb, 0, wx.EXPAND)
# Setting Layouts
self.SetAutoLayout(True)
self.SetSizer(sizer)
sizer.Fit(self)
EvDB.py
import sqlite3 as lite
class EvDB():
def __init__(self, parent):
self.db = lite.connect('evDB.db')
self.cur = self.db.cursor()
def createTbls(self):
self.db.execute('''CREATE TABLE IF NOT EXISTS Projects
(ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
Title varchar(50) DEFAULT NULL,
DateCreated DATE);''')
self.db.execute('''CREATE TABLE IF NOT EXISTS User_x_Project
(ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
UserID INT DEFAULT NULL,
ProjectID INT DEFAULT NULL);''')
def getProjects(self,userID):
self.cur.execute("SELECT Title FROM User_x_Project, Projects WHERE User_x_Project.UserID = "+str(userID)+" AND User_x_Project.ProjectID = Projects.ID;")
rows = self.cur.fetchall()
return rows
les résultats d'impression: [(u'Tests',), (u'Test1',), (u'Test2',), (u'Test3',)]
Comment puis-je ajouter les titres stockés dans ma base de données sqlite pour ma combobox?
Merci pour toute aide!
EDIT: Voici ma toute traceback
C:\Python27\python.exe C:/Users/xxx/xxx/xxx/main.py
[(u'Tests',), (u'Test1',), (u'Test2',), (u'Test3',)]
[(u'Tests',), (u'Test1',), (u'Test2',), (u'Test3',)]
Traceback (most recent call last):
File "C:/Users/xxx/xxx/xxx/main.py", line 43, in <module>
frame = MyFrame(None, -1, 'Small editor')
File "C:/Users/xxx/xxx/xxx/main.py", line 37, in __init__
self.projectsPg.cb.Value(rows)
TypeError: 'unicode' object is not callable
Process finished with exit code 1
OriginalL'auteur user908759 | 2014-10-14
Vous devez vous connecter pour publier un commentaire.
self.projectsPg.cb
est un objet ComboBox, etValue
est une propriété. Si vous accédez à la propriété, sans affectation, il sera de retour d'une chaîne de caractères (unicode). Vous ne pouvez pas l'appeler.Si vous souhaitez définir une valeur pour le combox, utilisation de la propriété, la cession (
zone de liste déroulante.Valeur =
), ouComboxBox.SetValue
:En plus de cela, le
rows
retourné parCurseur.fetchall
est une liste de tuples. Vous devez aller chercher la première. (Dans l'exemple suivant, j'ai omis de retourner le nombre de lignes de vérifier par souci de concision)Pour info j'ai trouvé la réponse à repeupler la zone de liste déroulante de choix here
OriginalL'auteur falsetru