从sqlite3填充组合框可编辑的用户名和行编辑密码 - python

我有1个combobox可编辑的用户名和1行编辑密码,我想将用户列表从数据库sqlite3加载到combobox。加载列表后,我要对itemlist组合框执行操作,以从数据库中获取当前所选用户的密码。

pyqt5应用

表列

表记录

######Combo Box 2 - PM's
        self.groupBox_2 = QtWidgets.QGroupBox(self.tab)
        self.groupBox_2.setGeometry(QtCore.QRect(10, 140, 191, 51))
        self.groupBox_2.setObjectName("groupBox_2")
        self.comboBox_3 = QtWidgets.QComboBox(self.groupBox_2)
        self.comboBox_3.setGeometry(QtCore.QRect(10, 20, 171, 22))
        self.comboBox_3.setObjectName("comboBox_3")
        self.comboBox_3.addItems(self.pm_Combo)

def pm_Combo(self):
        conn = sqlite3.connect('testdb.db')
        c = conn.cursor()
        c.execute("SELECT DISTINCT projectmanager FROM testtable2")
        pmList = c.fetchall()
        conn.commit()
        conn.close()

参考方案

假设表被称为“用户”,那么您可以使用userData保存信息,并在QComboBox的currentIndex更改时在QLineEdit中进行设置:

import os
import sqlite3
import sys

from PyQt5 import QtWidgets, QtSql


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.username_combo = QtWidgets.QComboBox()
        self.password_lineedit = QtWidgets.QLineEdit()

        button_login = QtWidgets.QPushButton(self.tr("Login"))

        lay = QtWidgets.QFormLayout(self)
        lay.addRow(self.tr("Username:"), self.username_combo)
        lay.addRow(self.tr("Password:"), self.password_lineedit)
        lay.addRow(button_login)

        self.username_combo.currentIndexChanged.connect(self.update_password)

        self.load_usernames()

    def load_usernames(self):
        current_dir = os.path.dirname(os.path.realpath(__file__))
        db_path = os.path.join(current_dir, "testdb.db")

        self.username_combo.clear()
        with sqlite3.connect(db_path) as conn:
            cursor = conn.execute("SELECT DISTINCT username, password FROM User")
            for result in cursor.fetchall():
                username, password = result
                self.username_combo.addItem(username, password)

    def update_password(self):
        self.password_lineedit.setText(self.username_combo.currentData())


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

另一个可能的解决方案是将QSqlQueryModel与QDataWidgetMapper一起使用:

import os
import sys

from PyQt5 import QtWidgets, QtSql


def create_connection():
    current_dir = os.path.dirname(os.path.realpath(__file__))
    db_path = os.path.join(current_dir, "testdb.db")

    db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName(db_path)
    if not db.open():
        print("error: {}".format(db.lastError().text()))
        return False
    return True


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.username_combo = QtWidgets.QComboBox()
        self.password_lineedit = QtWidgets.QLineEdit()

        button_login = QtWidgets.QPushButton(self.tr("Login"))

        lay = QtWidgets.QFormLayout(self)
        lay.addRow(self.tr("Username:"), self.username_combo)
        lay.addRow(self.tr("Password:"), self.password_lineedit)
        lay.addRow(button_login)
        self.load_data()

    def load_data(self):
        self.model = QtSql.QSqlQueryModel()
        self.model.setQuery("""SELECT DISTINCT username, password FROM User""")
        self.mapper = QtWidgets.QDataWidgetMapper()
        self.mapper.setModel(self.model)
        self.mapper.addMapping(self.password_lineedit, 1)
        self.username_combo.currentIndexChanged.connect(self.mapper.setCurrentIndex)
        self.username_combo.setModel(self.model)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    if not create_connection():
        sys.exit(-1)

    w = Widget()
    w.show()

    sys.exit(app.exec_())

Python:在不更改段落顺序的情况下在文件的每个段落中反向单词? - python

我想通过反转text_in.txt文件中的单词来生成text_out.txt文件,如下所示:text_in.txt具有两段,如下所示:Hello world, I am Here. I am eighteen years old. text_out.txt应该是这样的:Here. am I world, Hello old. years eighteen a…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

如何每隔n秒运行一个函数,但又不中断其他代码?也许在后台运行? - python

Python是我的第一语言,因此如果没有意义,请理解我。我正在用python制作虚拟宠物。我将Tkinter用于GUI。我想每5秒在Action类中运行一次display方法。但是,如果我使用线程,时间表或时间并将代码放在按钮的正前方,它就会冻结并只运行显示方法。如何在不中断按钮和其他部件的情况下每5秒运行一次显示方法?class Pet: def __in…

如何在python中将从PDF提取的文本格式化为json - python

我已经使用pyPDF2提取了一些文本格式的发票PDF。我想将此文本文件转换为仅包含重要关键字和令牌的json文件。输出应该是这样的:#PurchaseOrder {"doctype":"PO", "orderingcompany":"Demo Company", "su…