Поисковый запрос Tkinter в базе данных: TypeError: объект 'NoneType' не повторяется - PullRequest
0 голосов
/ 28 апреля 2020

Я не могу решить проблему с поисковым запросом в базе данных (sqlite3) в Tkinter. Части моего кода:

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

Я также пытался поставить Я в другой версии 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' не повторяется

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Есть несколько проблем с функцией 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
0 голосов
/ 28 апреля 2020

Ошибка 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 ничего не возвращает. Вам нужно добавить оператор return в функцию search.

...