【发布时间】:2020-11-22 15:36:48
【问题描述】:
我正在开发一个带有图形界面的数据库,我创建了一个连接到数据库的插入和删除方法,现在我正在创建一个搜索方法,但不幸的是没有为意外错误工作。代码有点长:
import sqlite3
from Tkinter import *
global all,root, main_text, num_ent, nom_ent, search_ent
def showall():
all = True
con = sqlite3.connect("repertoire.db")
cur = con.cursor()
request = 'select * from blinta'
cur.execute(request)
table = str(cur.fetchall()).replace(')', '\n').replace('(', '').replace(',', '').replace('[', '').replace(']', '')
return table
con.commit()
con.close()
def delete():
con = sqlite3.connect("repertoire.db")
cur = con.cursor()
request = ' DELETE FROM blinta WHERE id=?'
cur.execute(request, (ident.get(),))
con.commit()
con.close()
main_text.configure(state='normal')
main_text.delete(1.0, END)
main_text.insert(1.0, showall())
main_text.configure(state='disabled')
ident.delete(0,END)
def insert():
con = sqlite3.connect("repertoire.db")
cur = con.cursor()
request = 'insert into blinta (nom,numero) values(?,?)'
cur.execute(request, (nom_ent.get(), num_ent.get()))
con.commit()
con.close()
main_text.config(state='normal')
main_text.delete(1.0, END)
main_text.insert(1.0, showall())
main_text.config(state='disabled')
num_ent.delete(0, END)
nom_ent.delete(0, END)
def search():
all=False
con = sqlite3.connect("repertoire.db")
cur = con.cursor()
request = "select * from blinta where nom = ?"
noun = search_ent.get()
args=(noun,)
cur.execute(request,args)
selected = str(cur.fetchall()).replace(')', '\n').replace('(', '').replace(',', '').replace('[', '').replace(']', '')
return selected
con.commit()
con.close()
root = Tk()
root.config(bg='#D2B024')
root.geometry('450x650+900+0')
root.minsize(450, 650)
root.maxsize(450, 650)
main_text = Text(root, bg='#CBCAC5', fg='black', width=30, height=40, state='normal')
main_text.grid(column=1, row=1, rowspan=50, padx=9, pady=3)
main_text.delete(1.0, END)
if all == True :
main_text.insert(1.0, showall())
else :
main_text.insert(1.0, search())
main_text.config(state='disabled')
nomlbl=Label(root,text='Enter noun to insert',bg='#D2B024').grid(row=1,column=2)
nom_ent = Entry(root)
nom_ent.grid(row=2, column=2)
num_lbl=Label(root, text='Enter number to insert', bg='#D2B024').grid(row=3, column=2)
num_ent = Entry(root)
num_ent.grid(row=4, column=2)
insert_btn = Button(relief='flat', fg='black', width=7,
text='insert', font=("heveltica Bold", 15),
command=insert).grid(row=5, column=2,
columnspan=2, padx=50)
Label(root,text='_______________________',bg='#D2B024').grid(row=6,column=2)
idlbl=Label(root,text='Enter id to delete',bg='#D2B024').grid(row=7,column=2)
ident=Entry(root)
ident.grid(row=8,column=2)
delete_btn = Button(relief='flat', fg='black', width=7,
text='delete', font=("heveltica Bold", 15),
command=delete).grid(row=9, column=2,
columnspan=2, padx=0)
Label(root,text='_______________________',bg='#D2B024').grid(row=10,column=2)
search_lbl=Label(root,text='Enter noun to search',bg='#D2B024').grid(row=11,column=2)
search_btn = Button(relief='flat', fg='black', width=7,
text='search', font=("heveltica Bold", 15),
command=search).grid(row=13, column=2,
columnspan=2, padx=0)
global search_ent
search_ent = Entry(root)
search_ent.grid(row=12, column=2)
root.mainloop()
所有问题都与未定义条目 search_ent 的搜索功能有关,我确定它在全局范围内 错误是:
Traceback (most recent call last):
File "C:/Users/asus/Documents/python/Projet/managment system/main.py", line
70, in <module>
main_text.insert(1.0, search())
File "C:/Users/asus/Documents/python/Projet/managment system/main.py", line
51, in search
noun = search_ent.get()
NameError: name 'search_ent' is not defined
【问题讨论】:
-
将
global search_ent放入search函数中。 如果您需要在函数内访问和更改全局变量的值,该权限也由函数内的 global 关键字授予。 -
请提供minimal reproducible example。同时发布完整的回溯。
-
你在
search_ent = Entry(root)之前定义了类似Button(..., command=search(), ...)的按钮吗? -
回溯显示
main_text.insert(1.0, search())行导致错误,因为当search()被上述行调用时,search_ent尚未定义。注意all是一个内置函数,所以if all == True会被判断为false,所以else块会被执行。 -
table = str(cur.fetchall()).replace(')', '\n').replace('(', '').replace(',', '').replace('[', '').replace(']', '')此行可以替换为更简单的术语,例如通过索引您可以访问每个术语并循环遍历它们
标签: python python-3.x database sqlite tkinter