PyCharm开发Python密码管理器删除.db文件后报IndexError如何解决
问题根因
你的猜测完全正确,报错就是删除旧库后新生成的数据库为空,open_vault函数的遍历逻辑存在缺陷导致的。
代码缺陷点
open_vault中存在两处逻辑错误:
- sqlite的
cursor.fetchall()在查询结果为空时返回的是**空列表[]**而非None,所以if cursor.fetchall() != None:的判断条件在空库场景下依然会成立,错误进入遍历逻辑 - 进入循环后第一次执行
array = cursor.fetchall()拿到的是空列表,直接取array[i][1](i初始为0)时,空列表没有对应索引的元素,直接触发IndexError
此外原有逻辑还有显示问题:所有记录的Label都固定放在x=400,y=400的位置,即使有数据也会全部重叠无法正常查看。
修复方案
替换原有open_vault函数为以下代码即可,只执行一次数据库查询减少开销,增加空结果判断规避索引报错,同时添加纵向偏移让多条记录正常排列:
def open_vault(): global vault vault = Tk() vault.resizable(False, False) vault.title("Evault") vault.geometry("750x500") vault.configure(bg='#212121') Label(vault, text="Service", bg='#212121', fg='#ABABAB').place(relx=0.2, y=75) Label(vault, text="Username", bg='#212121', fg='#ABABAB').place(relx=0.45, y=75) Label(vault, text="Password", bg='#212121', fg='#ABABAB').place(relx=0.7, y=75) Button(vault, text="Register new credentials", bg='#673AB7', fg='#FFFFFF', command=register_credentials).place( width=150, height=40, relx=0.5, y=450, anchor=CENTER) # 仅执行一次查询拿到所有数据 cursor.execute('SELECT * FROM vault') all_records = cursor.fetchall() # 仅当有记录时执行遍历渲染 if len(all_records) > 0: y_offset = 120 for record in all_records: Label(vault, text=record[1], font=("Helvetica", 12)).place(x=150, y=y_offset) Label(vault, text=record[2], font=("Helvetica", 12)).place(x=337, y=y_offset) Label(vault, text=record[3], font=("Helvetica", 12)).place(x=525, y=y_offset) y_offset += 30 vault.mainloop()
内容的提问来源于stack exchange,提问作者Djanger
相关产品推荐
相关产品推荐

