You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyCharm开发Python密码管理器删除.db文件后报IndexError如何解决

问题根因

你的猜测完全正确,报错就是删除旧库后新生成的数据库为空,open_vault函数的遍历逻辑存在缺陷导致的。

代码缺陷点

open_vault中存在两处逻辑错误:

  1. sqlite的cursor.fetchall()在查询结果为空时返回的是**空列表[]**而非None,所以if cursor.fetchall() != None:的判断条件在空库场景下依然会成立,错误进入遍历逻辑
  2. 进入循环后第一次执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:30:05