2014-12-26 7 views
0

У меня есть код, который должен отображать метку для значений, одинаковых в базе данных, с данными, введенными в поле ввода. Но я получаю только последнее значение отображаемой метки, а не первое значение.получает последнее значение от mysql

База данных:

a1 bike 
a2 car  

Проблема: Если я вхожу a1, велосипед не displayed..but я получить машину, когда a2 вводится.

Кодирование:

import Tkinter as tki 
import MySQLdb 
db = MySQLdb.connect(host="localhost", # your host, usually localhost 
         user="root", # your username 
          passwd="mysql", # your password 
          db="sakila") # name of the data base 
cursor = db.cursor() 

    # execute SQL select statement 
cursor.execute("SELECT A1,A2 FROM adarsh1") 
keywords1=[] 
for i in cursor.fetchall(): 
    keywords1.append(i[0]) 
    keywords1.append(i[1]) 

class App(object): 
    def __init__(self,root): 
     self.root = root 

     self.txt_frm = tki.Frame(self.root, width=900, height=900) 
     self.txt_frm.pack(fill="both", expand=True) 
     button3 = tki.Button(self.txt_frm,text="CLICK 1", command = self.retrieve_inpu) 
     button3.grid(column=0,row=2) 
     self.entry = tki.Entry(self.txt_frm) 
     self.entry.grid(column=1,row=0) 

     #create label in init 
     self.label = tki.Label(self.txt_frm) 
     self.label.grid(column=0,row=3) 

    def retrieve_inpu(self): 
     ent = self.entry.get() 

     if ent in i[0]: 
      self.label['text'] = i[1] 


root = tki.Tk() 
app = App(root) 
root.mainloop() 

ответ

3

Вы используете i в качестве переменной цикла при строительстве keywords1:

for i in cursor.fetchall(): 
    keywords1.append(i[0]) 
    keywords1.append(i[1]) 

i никогда не очищается, она остается связанной с последней строки из базы данных.

Вы затем повторно использовать, что глобальное имя:

def retrieve_inpu(self): 
    ent = self.entry.get() 

    if ent in i[0]: 
     self.label['text'] = i[1] 

С i по-прежнему установлен на ['a2', 'car'] выше if заявление будет только когда будет верно, если ent установлен в одном из 'a2', 'a' или '2'.

Вы могли бы вместо этого использовать словарь:

keywords1 = {} 
for row in cursor.fetchall(): 
    keywords1[row[0]] = row[1] 

Теперь вы отображающие значения из первого столбца во второй. В вашей retrieve_inpu функции теперь вы можете просто посмотреть значение, если ключ существует:

def retrieve_inpu(self): 
    ent = self.entry.get() 

    if ent in keywords1: 
     self.label['text'] = keywords1[ent] 

Это будет соответствовать только целым словам, поэтому только 'a2' или 'a1' бы.

Лучший метод должен был бы задать базу данных на матч вместо:

def retrieve_inpu(self): 
    ent = self.entry.get() 

    cursor.execute('SELECT A2 FROM adarsh1 WHERE A1=%s', (ent,)) 
    row = cursor.fetchone() 
    if row: 
     self.label['text'] = row[0] 

Это опять-таки соответствует только целых слов; только если есть строка с точным соответствием для A1, эта строка может быть возвращена. Чтобы выполнить эту работу для подстрочных совпадений, вы можете использовать запрос LIKE:

def retrieve_inpu(self): 
    ent = self.entry.get() 

    cursor.execute('SELECT A2 FROM adarsh1 WHERE A1 LIKE %s', ('%{}%'.format(ent),)) 
    row = cursor.fetchone() 
    if row: 
     self.label['text'] = row[0] 
Смежные вопросы