我有一个代码,需要在数据库中显示与输入框中输入的数据相同的值的标签。但是我只得到显示的标签的最后一个值而不是第一个值。
数据库:
a1 bike
a2 car
问题:如果我输入a1,自行车没有显示..但是当输入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()
答案 0 :(得分: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'
语句才会成立1}},或'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]