PyQt5 使用 SQLite3,按下按钮进行查询

Posted

技术标签:

【中文标题】PyQt5 使用 SQLite3,按下按钮进行查询【英文标题】:PyQt5 using SQLite3, on button press doing a query 【发布时间】:2017-02-25 04:27:53 【问题描述】:

到目前为止,Python 的进展非常好。我需要有关此代码的帮助:

def btn_clk(self):
    sender = self.sender()
    if sender.text() == "Submit":
        entry = self.mod_num.text()
        conn = sqlite3.connect("uprightsbeams.db")
        c = conn.cursor()
        c.execute("SELECT * FROM uprightbeam WHERE catalogNo=?", [entry])
        results = c.fetchone()
        print(results)

此代码还有更多内容,但这是我的程序中断的地方。几乎在按下按钮时,我希望它对我的 uprightsbeams.db 执行查询以获取 catalogNo,这样我就可以获得与之关联的行值。

我有这个catalogNo作为文本值存储在sqlite3中,所以我认为它可以得到它没有问题,但我认为这甚至在那之前就已经打破了。我需要在方法之外连接到数据库吗?我尝试了许多不同的变体,但我就是想不通。

看到这里发生这种情况时没有错误代码是程序的代码。:

import sys
import os
import sqlite3
from PyQt5.QtWidgets import QTableWidget, QMainWindow, QApplication, QLabel, QTableWidgetItem, QWidget, QTableView
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5 import QtCore, QtWidgets, QtGui


class MyTable(QTableWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(48, 0, 1080, 451)
        self.setRowCount(34)
        self.setColumnCount(14)


class Sheet(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        QMainWindow.setGeometry(self, 1, 30, 1918, 1050)
        self.form_widget = MyTable()
        self.row = 0
        self.col = 0
        col_headers = ['CATALOG NO.', 'DESCRIPTION', 'COLOR', 'QTY.', 'UN.', 'WGT.', 'Total Wgt.', 'List Price', 'Net', 'Total Net', 'Total List',"","Item Discount",""]
        self.form_widget.setHorizontalHeaderLabels(col_headers)
        self.form_widget.verticalHeader().setVisible(False)



        #h_box1 Layout
        self.cat_num_lab = QtWidgets.QLabel(self)
        self.cat_num_lab.setText("Part Number:")

        self.mod_num = QtWidgets.QLineEdit(self)

        self.color_label = QtWidgets.QLabel(self)
        self.color_label.setText("Color: ")

        self.color_Entry = QtWidgets.QLineEdit(self)

        self.qty_label = QtWidgets.QLabel(self)
        self.qty_label.setText("QTY:")

        self.qty_Entry = QtWidgets.QLineEdit(self)        

        self.sub_btn = QtWidgets.QPushButton("Submit")
        self.sub_btn.clicked.connect(self.btn_clk)


        #h_box2 Layout
        self.cat_man_Entry = QtWidgets.QLabel(self)
        self.cat_man_Entry.setText("Manual Entry")

        self.man_part_num = QtWidgets.QLabel(self)
        self.man_part_num.setText("Part Number:")

        self.man_part_Entry = QtWidgets.QLineEdit(self)

        self.man_disc = QtWidgets.QLabel(self)
        self.man_disc.setText("Description: ")

        self.man_disc_Entry = QtWidgets.QLineEdit(self)

        self.man_color_label = QtWidgets.QLabel(self)
        self.man_color_label.setText("Color: ")

        self.man_color_Entry = QtWidgets.QLineEdit(self)

        self.man_qty_label = QtWidgets.QLabel(self)
        self.man_qty_label.setText("QTY:")

        self.man_qty_Entry = QtWidgets.QLineEdit(self)

        self.man_unit_meas = QtWidgets.QLabel(self)
        self.man_unit_meas.setText("Unit Measure: ")

        self.man_unit_meas_Entry = QtWidgets.QLineEdit(self)

        self.man_wgt = QtWidgets.QLabel(self)
        self.man_wgt.setText("WGT.: ")

        self.man_wgt_Entry = QtWidgets.QLineEdit(self)

        self.man_list_price = QtWidgets.QLabel(self)
        self.man_list_price.setText("List Price: ")

        self.man_list_price_Entry = QtWidgets.QLineEdit(self)        

        self.man_sub_btn = QtWidgets.QPushButton("Man. Submit")
        self.man_sub_btn.clicked.connect(self.btn_clk)



        #Layout
        h_box1 = QtWidgets.QHBoxLayout()
        h_box1.addWidget(self.cat_num_lab)
        h_box1.addWidget(self.mod_num)        
        h_box1.addWidget(self.color_label)
        h_box1.addWidget(self.color_Entry)
        h_box1.addWidget(self.qty_label)
        h_box1.addWidget(self.qty_Entry)
        h_box1.addWidget(self.sub_btn)
        h_box1.addStretch()

        h_box2 = QtWidgets.QHBoxLayout()
        h_box2.addWidget(self.cat_man_Entry)
        h_box2.addWidget(self.man_part_num)
        h_box2.addWidget(self.man_part_Entry)
        h_box2.addWidget(self.man_disc)
        h_box2.addWidget(self.man_disc_Entry)
        h_box2.addWidget(self.man_color_label)
        h_box2.addWidget(self.man_color_Entry)
        h_box2.addWidget(self.man_qty_label)
        h_box2.addWidget(self.man_qty_Entry)
        h_box2.addWidget(self.man_unit_meas)
        h_box2.addWidget(self.man_unit_meas_Entry)
        h_box2.addWidget(self.man_wgt)
        h_box2.addWidget(self.man_wgt_Entry)
        h_box2.addWidget(self.man_list_price)
        h_box2.addWidget(self.man_list_price_Entry)
        h_box2.addWidget(self.man_sub_btn)
        h_box2.addStretch()

        h_box3 = QtWidgets.QHBoxLayout()
        h_box3.addWidget(self.form_widget)


        v_box = QtWidgets.QVBoxLayout()
        v_box.addLayout(h_box1)
        v_box.addLayout(h_box2)
        v_box.addLayout(h_box3)

        self.setLayout(v_box)



        self.show()



    def btn_clk(self):
        sender = self.sender()
        if sender.text() == "Submit":
            entry = QTableWidgetItem(self.mod_num.text())
            conn = sqlite3.connect("uprightsbeams.db")
            c = conn.cursor()
            c.execute("Select * FROM uprightbeam WHERE catalogNo=?", [entry])
            results = c.fetchone()
            print(results)
            col = 0
            self.form_widget.setCurrentCell(self.row, col)
            self.form_widget.setItem(self.row, col, entry)
            col = 2
            color = QTableWidgetItem(self.color_Entry.text())
            self.form_widget.setCurrentCell(self.row, col)
            self.form_widget.setItem(self.row, col, color)
            col = 3
            qty = QTableWidgetItem(self.qty_Entry.text())
            self.form_widget.setCurrentCell(self.row, col)
            self.form_widget.setItem(self.row, col, qty)
            self.row += 1
            self.mod_num.clear()
            self.color_Entry.clear()
            self.qty_Entry.clear()
        else:
            col = 0
            cat_num = QTableWidgetItem(self.man_part_Entry.text())
            self.form_widget.setCurrentCell(self.row, col)
            self.form_widget.setItem(self.row, col, cat_num)
            col = 1
            man_disc = QTableWidgetItem(self.man_disc_Entry.text())
            self.form_widget.setCurrentCell(self.row, col)
            self.form_widget.setItem(self.row, col, man_disc)
            col = 2
            man_color = QTableWidgetItem(self.man_color_Entry.text())
            self.form_widget.setCurrentCell(self.row, col)
            self.form_widget.setItem(self.row, col, man_color)
            col = 3
            man_qty = QTableWidgetItem(self.man_qty_Entry.text())
            self.form_widget.setCurrentCell(self.row, col)
            self.form_widget.setItem(self.row, col, man_qty)
            col = 4
            man_unit = QTableWidgetItem(self.man_unit_meas_Entry.text())
            self.form_widget.setCurrentCell(self.row, col)
            self.form_widget.setItem(self.row, col, man_unit)
            col = 5
            man_wgt = QTableWidgetItem(self.man_wgt_Entry.text())
            self.form_widget.setCurrentCell(self.row, col)
            self.form_widget.setItem(self.row, col, man_wgt)
            col = 7
            man_price = QTableWidgetItem(self.man_list_price_Entry.text())
            self.form_widget.setCurrentCell(self.row, col)
            self.form_widget.setItem(self.row, col, man_price)
            self.row += 1
            self.man_part_Entry.clear()
            self.man_disc_Entry.clear()
            self.man_wgt_Entry.clear()
            self.man_list_price_Entry.clear()

app = QApplication(sys.argv)
sheet = Sheet()
sys.exit(app.exec_())

更新

我从来不需要从控制台运行代码,所以我从来没有,总是通过 IDLE 运行。我通过控制台运行了应用程序,这是回溯:

Traceback (most recent call last):
  File "E:\srold.py", line 147, in btn_clk
    c.execute("Select * FROM uprightbeam WHERE catalogNo=?", entry)
ValueError: parameters are of unsupported type

更新 当我试图将 QTableWidgetItem 作为条目值传递时,我已经从 ValueError 继续前进。我已将其更改为 self.mod_num.text() 中的 QLineEdit 文本。

现在我有了这个,我目前不明白:

Traceback (most recent call last):
  File "E:\srold.py", line 147, in btn_clk
    c.execute("SELECT * FROM uprightbeam WHERE catalogNo=?", entry)
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 12 supplied.

我不明白,因为在我的代码中我有:

c.execute("SELECT * FROM uprightbeam WHERE catalogNo=?", [entry])

我将条目设置为列表,我认为这样可以防止绑定数量不正确的问题。

【问题讨论】:

感谢您对错误消息保密。 如果有错误代码我会提供。发生的情况是我单击按钮,然后应用程序崩溃,shell 中没有错误代码。 见PyQt: No error msg (traceback) on exit。 “无错误代码”是什么意思?有一个 Python 回溯,它将清楚地显示(相当明显的)问题是什么。 ekhumoro,感谢您贬低了初学者。如果很明显,请让我回答一下。我花了一天半的时间寻找这个答案。 【参考方案1】:

我已经得到了这个工作。

回答最初的问题是我试图将 QTableWidgetItem 的值传递给变量,而我可以直接从框中使用 QLineEdit 的值。在此过程中我也遇到了一些语法错误,但我的 btn_clk 代码完成的顶部如下:

sender = self.sender()
    if sender.text() == "Submit":
        entry = self.mod_num.text()
        conn = sqlite3.connect("uprightsbeams.db")
        c = conn.cursor()
        c.execute("SELECT * FROM beamupright WHERE catalogNo=?", [entry])
        results = c.fetchone()
        print(results)

我现在可以继续这个项目了。

【讨论】:

以上是关于PyQt5 使用 SQLite3,按下按钮进行查询的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 QPushButton setSyleSheet 按下时不改变按钮颜色

如何检测在 PyQt5 中按下了动态添加的按钮之一? [复制]

在 QtWidgets 的 PyQt5 中按下角落的红色 x 按钮时如何处理/覆盖?

按下保存按钮pyqt5后关闭第二个小部件

如何使用按钮在 PyQt5 中的两个菜单栏之间切换?菜单栏消失

如何通过按下 Pyqt5 或 PyQt4 工具栏中的按钮来设置表单的显示