Python图书登记系统如何更新AutocompleteCombobox的全部自动补全值
问题原因
你当前的自动补全列表更新逻辑仅覆盖了「新增出版社」的场景,其余两个会新增作者/出版社数据的场景没有触发列表更新,同时还要检查数据库事务提交和组件刷新逻辑:
- 新增作者的分支中没有更新作者自动补全列表
- 新增图书的分支中如果支持录入新作者/新出版社,也没有触发自动补全列表更新
- 若数据库插入操作没有提交事务,查询方法无法读取到未提交的新数据
- 部分
AutocompleteCombobox实现更新completevalues属性后需要主动刷新缓存才会生效
修复方案
1. 先确认数据库插入操作已提交事务
检查你的data_base类中add_autor、add_editora、add_livro方法,执行完INSERT语句后必须调用连接对象的commit方法,示例如下:
def add_autor(self, autor): self.cursor.execute('INSERT INTO autores (autor) VALUES (?)', (autor,)) self.conn.commit() # 必须加这行提交事务,否则查询不到新数据
add_editora、add_livro方法同理补充提交逻辑。
2. 抽离自动补全列表更新公共方法
在代码中新增一个公共方法统一处理两个下拉框的列表更新:
def atualizar_listas_autocomplete(): # 重新从数据库拉取最新的作者、出版社列表 autores = data_base.nome_autores() editoras = data_base.nome_editoras() # 更新下拉框候选值 autor_entry_registro_livro['completevalues'] = autores editora_entry_registro_livro['completevalues'] = editoras # 部分AutocompleteCombobox实现需要主动刷新缓存,可选补充以下代码 autor_entry_registro_livro.update_idletasks() editora_entry_registro_livro.update_idletasks()
3. 在所有新增数据的分支调用更新方法
修改adicionar_registro函数,三个分支全部补充调用更新方法:
def adicionar_registro(): if drop_down_register.get() == 'Livro': # ... 原有校验逻辑不变 else: data_base.add_livro(titulo, autor, editora, n_pages, proprietario) # ... 原有清空输入框逻辑不变 # 新增调用自动补全更新方法 atualizar_listas_autocomplete() carrega_tabelas() cancelar_registro() elif drop_down_register.get() == 'Autor': # ... 原有校验逻辑不变 else: data_base.add_autor(autor) # ... 原有清空输入框逻辑不变 # 新增调用自动补全更新方法 atualizar_listas_autocomplete() carrega_tabelas() cancelar_registro() elif drop_down_register.get() == 'Editora': # ... 原有校验逻辑不变 else: data_base.add_editora(editora) # ... 原有清空输入框逻辑不变 # 删掉原来重复的更新代码,调用公共方法 atualizar_listas_autocomplete() carrega_tabelas() cancelar_registro()
额外说明
如果你的add_livro方法不会自动将录入的新作者/新出版社插入到autores、editoras表中,需要在新增图书的校验逻辑中补充判断:如果录入的作者不在现有作者列表,先调用data_base.add_autor插入,出版社同理,再执行新增图书的逻辑,否则新的作者/出版社不会进入数据库,自然也不会出现在自动补全列表中。
内容的提问来源于stack exchange,提问作者Jhosef Matheus
相关产品推荐
相关产品推荐

