2021-05-26-阿杰学pyqt5输入内容并检索历史输入

本文介绍了一个初学者如何使用Python和PyQt5构建一个带有自动历史检索功能的文本输入框,通过监听输入变化实时匹配历史记录并显示在列表中,同时支持新增输入内容的保存和退出时的数据保存。

阿杰学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学的比较浅,若更好意见或需要改正的地方,请指出,不胜感谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值