【问题标题】:Tkinter search query in database: TypeError: 'NoneType' object is not iterable数据库中的 Tkinter 搜索查询:TypeError:'NoneType' 对象不可迭代
【发布时间】:2020-08-12 16:11:04
【问题描述】:

我无法解决 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 类数据库:

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!')

我还尝试将 self 放入其他版本的 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!')

请帮忙解决错误:

对于 backend.database.search(self.name_text.get(),self.color_text.get()) 中的行: TypeError: 'NoneType' 对象不可迭代

【问题讨论】:

  • 该错误告诉您搜索返回None。您的代码需要处理这种情况。另外,您为什么认为需要添加self 作为要查询的值之一?
  • 我知道这意味着它返回 None (无行)。但不知道如何重写代码。自我没有工作。
  • 您正在使用search 方法的结果,但您似乎没有从search 方法返回值。您发布的代码是该功能的完整代码吗?

标签: search tkinter nonetype


【解决方案1】:

backend.database.search() 函数有几个问题:

  • name_text 和 color_text 未定义
  • 传递的参数name 和color 应该在values 中使用
  • 它没有返回任何结果(这是错误的原因)

下面是修改后的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

【讨论】:

  • 超级,您的更改正在生效。我自己也想不通。非常感谢。
【解决方案2】:

错误TypeError: 'NoneType' object is not iterable 表示您的查询没有返回任何行。

这至少部分是因为这段代码:

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 没有返回任何内容。您需要在search 函数中添加return 语句。

【讨论】:

  • 非常感谢您的帮助。不幸的是,它没有用。出现了同样的错误。 "for row in backend.database.search(self.name_text.get(),self.color_text.get()): TypeError: 'NoneType' object is not iterable"
  • 嗯,这意味着查询没有返回任何信息。您是否已验证 name_text.get() 和 color_text.get() 正在返回您认为他们应该返回的内容?您确定这些值与数据库中的数据匹配吗?
  • 是的,因为还有一个有效的插入和删除命令。在 het view 命令中,行显示出来,我可以用光标选择它们并删除它们。只有搜索命令不起作用。
  • @green 如果您为选择使用正确的值并且数据库具有这些值,则查询将返回值。唯一合乎逻辑的结论是查询参数不是您假设的那样。第一步是验证它们是您认为的那样。
猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 2017-08-29
  • 2016-08-30
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多