阿杰学python,pyqt5listwidget加lineedit实现输入框内容并检索历史类似输入
效果图展示

import re
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QMessageBox, QLineEdit, QListWidget, QVBoxLayout
import os
class My_ui(QWidget):
def __init__(self):
super(My_ui, self).__init__()
self.my_listwidget()
def my_listwidget(self):
# 创建控件及布局
self.lineedit = QLineEdit()
self.lineedit.textChanged.connect(self.change_listwidget)
self.lineedit.editingFinished.connect(self.write_file)
self.listwidget = QListWidget()
self.listwidget.hide()
self.listwidget.setFixedHeight(100)
self.listwidget.setStyleSheet(
"QListWidget{"
"border:none;"
"}"
"QScrollBar"
"{"
"width:px;"
"background:rgb(0,0,0,0%);"
"margin:0px,0px,0px,0px;"
"padding-top:0px;"
"padding-bottom:0px;"
"}"
)
layout = QVBoxLayout()
layout.addWidget(self.lineedit)
layout.addWidget(self.listwidget)
self.setLayout(layout)
# 创建数据存储的文件
self.file = os.path.abspath(".") + 'text.txt'
with open(self.file, 'a') as f_create:
pass
# listwidget_data 为listwidget.items 的所有可能用到的插入的item内容
self.listwidget_data = []
# remember_data 为新增的listwidget.item内容
self.remember_data = ""
# 从文件中读取所有的以往的输入内容到lineedit框内容
with open(self.file, 'r') as fr:
while True:
linedata = fr.readline()
if linedata:
if linedata != '\n':
self.listwidget_data.append(linedata.strip('\n'))
else:
break
# 通过my_re用来匹配前几个字符为当前lineedit的输入的文本
def my_re(self, str):
traget = self.lineedit.text()
"""
:param traget: 目标字符串
:param str: 查找的字符串
:return: 前几位匹配的字符串
"""
if re.match(traget, str, re.I):
return str
# 当lineedit控件输入框内容变化时触发,查找所有历史输入若存在首位相同显示listwidget控件
# 并向中插入匹配的结果作为item.每次显示时清空上次items项
def change_listwidget(self):
self.listwidget.disconnect()
if self.listwidget_data:
self.listwidget.clear()
self.current_listdata = list(filter(lambda x: x is not None, list(map(self.my_re, self.listwidget_data))))
self.listwidget.addItems(self.current_listdata)
self.listwidget.show()
if not self.listwidget.count():
self.listwidget.hide()
self.listwidget.clicked.connect(self.lineedit_set_text)
# 当点击listwidget的item时触发,将点击的item内容设置为当前lineedit文本
def lineedit_set_text(self, index):
row = index.row()
self.lineedit.setText(self.current_listdata[row])
# 编辑完成时触发,将lineedit文本内容与所有历史输入内容对比,不同则记住作为本次新增的输入内容
def write_file(self):
text = self.lineedit.text()
if text in self.listwidget_data:
pass
else:
self.remember_data += (text + '\n')
self.listwidget_data.append(text)
# 当关闭程序时触发,将本次记住的新增的输入内容写入文件
def closeEvent(self, event):
reply = QMessageBox.question(self, "提问", "确定退出吗", QMessageBox.Yes | QMessageBox.No)
if reply == QMessageBox.Yes:
with open(self.file, 'a') as fw:
fw.write(self.remember_data)
event.accept()
if reply == QMessageBox.No:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = My_ui()
main.show()
app.exit(app.exec_())
大二在校学生,pyqt5学的比较浅,若更好意见或需要改正的地方,请指出,不胜感谢
本文介绍了一个初学者如何使用Python和PyQt5构建一个带有自动历史检索功能的文本输入框,通过监听输入变化实时匹配历史记录并显示在列表中,同时支持新增输入内容的保存和退出时的数据保存。

被折叠的 条评论
为什么被折叠?



