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_textcolor_text 未定义
  • 传递的参数 namecolor 应该用在 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