Tkinter search query in database: TypeError: 'NoneType' object is not iterable
Tkinter search query in database: TypeError: 'NoneType' object is not iterable
我无法解决 Tkinter 数据库 (sqlite3) 中的搜索查询问题。我的部分代码:
front.py
# Entries
self.name_text = tk.StringVar()
self.entry_name = tk.Entry(self.parent, textvariable=self.name_text)
self.entry_name.grid(row=3, column=1)
self.color_text = tk.StringVar()
self.combobox2=ttk.Combobox(self.parent, textvariable=self.color_text)
self.combobox2["values"] = ('red','blue','white')
self.labelCombobox=ttk.Label(self.parent, textvariable=self.color_text)
self.combobox2.grid(row=4, column=1)
self.parent.bind('<Return>',lambda e:refresh())
def search_command(self):
self.listBox.delete(0,tk.END)
for row in backend.database.search(self.name_text.get(),self.color_text.get()):
self.listBox.insert(tk.END, row)
backend.py class database:
def search(name="",color=""):
try:
connect = sqlite3.connect("color.db")
cur = connect.cursor()
sql = "SELECT * FROM color WHERE name=? OR color=?"
values = (self, name_text.get(), color_text.get())
cur.execute(sql, values)
rows = cur.fetchall()
name_text.set(rows[1])
color_text.set(rows[2])
entry_name.configure('disabled')
combobox2.configure('disabled')
connect.close()
except:
messagebox.showinfo('nothing found!')
我也试过在另一个版本的 backend.py 中加入一个自我。这给出了同样的错误。
def search(self, name="",color=""):
try:
self.connect = sqlite3.connect("color.db")
self.cur = self.connect.cursor()
self.sql = "SELECT * FROM color WHERE name=? OR color=?"
self.values = (self, name_text.get(), color_text.get())
self.cur.execute(sql, values)
self.rows = self.cur.fetchall()
self.name_text.set(rows[1])
self.color_text.set(rows[2])
self.entry_name.configure('disabled')
self.combobox2.configure('disabled')
self.connect.close()
except:
messagebox.showinfo('nothing!')
请帮忙解决错误:
for row in backend.database.search(self.name_text.get(),self.color_text.get()):
TypeError: 'NoneType' object is not iterable
错误 TypeError: 'NoneType' object is not iterable
表示您的查询 return 没有行。
这至少部分是因为这段代码:
sql = "SELECT * FROM color WHERE name=? OR color=?"
values = (self, name_text.get(), color_text.get())
cur.execute(sql, values)
这导致 self
用于 name
参数,name_text.get()
的结果将与 color
属性相关联。 color_text.get()
的结果被忽略。
您需要删除 self
- 您的 sql 使用两个参数,因此您需要向它发送两个参数。
另一个问题似乎是您正在迭代 search
的结果,但是 search
没有 return 任何东西。您需要在 search
函数中添加 return
语句。
backend.database.search()
函数有几个问题:
name_text
和 color_text
未定义
- 传递的参数
name
和 color
应该用在 values
而不是
- 它没有return任何结果(这是错误的原因)
下面是修改后的 search()
函数:
def search(name="", color=""):
rows = () # assume no result in case of exception
try:
connect = sqlite3.connect("color.db")
cur = connect.cursor()
sql = "SELECT * FROM color WHERE name=? OR color=?"
values = (name, color) # use arguments name and color instead
cur.execute(sql, values)
rows = cur.fetchall()
connect.close()
except Exception as e:
print(e) # better to see what is wrong
messagebox.showinfo('nothing found!')
return rows # return result
我无法解决 Tkinter 数据库 (sqlite3) 中的搜索查询问题。我的部分代码:
front.py
# Entries self.name_text = tk.StringVar() self.entry_name = tk.Entry(self.parent, textvariable=self.name_text) self.entry_name.grid(row=3, column=1) self.color_text = tk.StringVar() self.combobox2=ttk.Combobox(self.parent, textvariable=self.color_text) self.combobox2["values"] = ('red','blue','white') self.labelCombobox=ttk.Label(self.parent, textvariable=self.color_text) self.combobox2.grid(row=4, column=1) self.parent.bind('<Return>',lambda e:refresh()) def search_command(self): self.listBox.delete(0,tk.END) for row in backend.database.search(self.name_text.get(),self.color_text.get()): self.listBox.insert(tk.END, row)
backend.py class database:
def search(name="",color=""): try: connect = sqlite3.connect("color.db") cur = connect.cursor() sql = "SELECT * FROM color WHERE name=? OR color=?" values = (self, name_text.get(), color_text.get()) cur.execute(sql, values) rows = cur.fetchall() name_text.set(rows[1]) color_text.set(rows[2]) entry_name.configure('disabled') combobox2.configure('disabled') connect.close() except: messagebox.showinfo('nothing found!')
我也试过在另一个版本的 backend.py 中加入一个自我。这给出了同样的错误。
def search(self, name="",color=""): try: self.connect = sqlite3.connect("color.db") self.cur = self.connect.cursor() self.sql = "SELECT * FROM color WHERE name=? OR color=?" self.values = (self, name_text.get(), color_text.get()) self.cur.execute(sql, values) self.rows = self.cur.fetchall() self.name_text.set(rows[1]) self.color_text.set(rows[2]) self.entry_name.configure('disabled') self.combobox2.configure('disabled') self.connect.close() except: messagebox.showinfo('nothing!')
请帮忙解决错误:
for row in backend.database.search(self.name_text.get(),self.color_text.get()): TypeError: 'NoneType' object is not iterable
错误 TypeError: 'NoneType' object is not iterable
表示您的查询 return 没有行。
这至少部分是因为这段代码:
sql = "SELECT * FROM color WHERE name=? OR color=?"
values = (self, name_text.get(), color_text.get())
cur.execute(sql, values)
这导致 self
用于 name
参数,name_text.get()
的结果将与 color
属性相关联。 color_text.get()
的结果被忽略。
您需要删除 self
- 您的 sql 使用两个参数,因此您需要向它发送两个参数。
另一个问题似乎是您正在迭代 search
的结果,但是 search
没有 return 任何东西。您需要在 search
函数中添加 return
语句。
backend.database.search()
函数有几个问题:
name_text
和color_text
未定义- 传递的参数
name
和color
应该用在values
而不是 - 它没有return任何结果(这是错误的原因)
下面是修改后的 search()
函数:
def search(name="", color=""):
rows = () # assume no result in case of exception
try:
connect = sqlite3.connect("color.db")
cur = connect.cursor()
sql = "SELECT * FROM color WHERE name=? OR color=?"
values = (name, color) # use arguments name and color instead
cur.execute(sql, values)
rows = cur.fetchall()
connect.close()
except Exception as e:
print(e) # better to see what is wrong
messagebox.showinfo('nothing found!')
return rows # return result