2014-12-26 47 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

建設keywords1當您使用i作爲循環變量:

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']如果ent被設置爲'a2'一個,'a',或'2'上述if語句將永遠只能是真實的。

你也可以使用一個字典

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] 
相關問題