pyqt5设计一个可识别的智能电子秤系统,有两个界面,在拍照界面对商品拍照显示并保存,跳转至数据库界面,将保存的图片加上名称、单价后存至数据库,给出完整代码及解释
时间: 2024-03-14 11:43:18 浏览: 183
好的,这是一个比较复杂的项目,需要用到PyQt5的许多功能,我们需要逐步实现。
首先需要安装PyQt5和OpenCV库,可以使用以下命令进行安装:
```
pip install PyQt5 opencv-python
```
接下来我们需要设计两个界面,一个是拍照界面,另一个是数据库界面。
## 拍照界面
我们使用PyQt5的QWidget类来创建拍照界面,界面中包含一个显示摄像头画面的QLabel和一个拍照按钮QPushButton。
```python
import sys
import cv2
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class CameraWidget(QWidget):
def __init__(self):
super().__init__()
# 创建控件
self.label = QLabel(self)
self.button = QPushButton('拍照', self)
# 设置控件位置和大小
self.label.setGeometry(0, 0, 640, 480)
self.button.setGeometry(270, 490, 100, 30)
# 创建摄像头
self.cap = cv2.VideoCapture(0)
# 定时器
self.timer = QTimer(self)
self.timer.timeout.connect(self.show_frame)
self.timer.start(30)
def show_frame(self):
ret, frame = self.cap.read()
if ret:
# 将摄像头画面转换成QImage格式
img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, c = img.shape
qimg = QImage(img.data, w, h, w*c, QImage.Format_RGB888)
self.label.setPixmap(QPixmap.fromImage(qimg))
def take_photo(self):
# 拍照并保存图片
ret, frame = self.cap.read()
if ret:
cv2.imwrite('photo.jpg', frame)
self.timer.stop()
self.cap.release()
self.label.clear()
self.button.setText('重拍')
```
在这个类中,我们定义了一个show_frame方法用来显示摄像头画面,take_photo方法用来拍照并保存图片。我们还创建了一个定时器来定时调用show_frame方法更新画面。
## 数据库界面
我们使用PyQt5的QMainWindow类来创建数据库界面,界面中包含一个显示图片和商品信息的QTableWidget和一个添加商品信息的QPushButton。
```python
from PyQt5.QtSql import *
class DatabaseWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建控件
self.table = QTableWidget(self)
self.button = QPushButton('添加商品', self)
# 设置控件位置和大小
self.table.setGeometry(0, 0, 640, 480)
self.button.setGeometry(270, 490, 100, 30)
# 创建数据库
self.db = QSqlDatabase.addDatabase('QSQLITE')
self.db.setDatabaseName('products.db')
self.db.open()
# 创建表格
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(['图片', '名称', '单价'])
def add_product(self, filename, name, price):
# 添加商品信息到数据库
query = QSqlQuery()
query.prepare('INSERT INTO products (filename, name, price) VALUES (?, ?, ?)')
query.addBindValue(filename)
query.addBindValue(name)
query.addBindValue(price)
query.exec_()
# 添加商品信息到表格
row = self.table.rowCount()
self.table.setRowCount(row+1)
self.table.setItem(row, 0, QTableWidgetItem(QIcon(filename), ''))
self.table.setItem(row, 1, QTableWidgetItem(name))
self.table.setItem(row, 2, QTableWidgetItem(str(price)))
```
在这个类中,我们定义了一个add_product方法用来将商品信息添加到数据库和表格中。
## 完整代码
最后,我们将拍照界面和数据库界面整合起来,实现一个完整的可识别的智能电子秤系统。
```python
import sys
import cv2
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtSql import *
class CameraWidget(QWidget):
def __init__(self):
super().__init__()
# 创建控件
self.label = QLabel(self)
self.button = QPushButton('拍照', self)
# 设置控件位置和大小
self.label.setGeometry(0, 0, 640, 480)
self.button.setGeometry(270, 490, 100, 30)
# 创建摄像头
self.cap = cv2.VideoCapture(0)
# 定时器
self.timer = QTimer(self)
self.timer.timeout.connect(self.show_frame)
self.timer.start(30)
def show_frame(self):
ret, frame = self.cap.read()
if ret:
# 将摄像头画面转换成QImage格式
img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, c = img.shape
qimg = QImage(img.data, w, h, w*c, QImage.Format_RGB888)
self.label.setPixmap(QPixmap.fromImage(qimg))
def take_photo(self):
# 拍照并保存图片
ret, frame = self.cap.read()
if ret:
cv2.imwrite('photo.jpg', frame)
self.timer.stop()
self.cap.release()
self.label.clear()
self.button.setText('重拍')
self.db_window.show()
# 获取商品名称和单价
name, price, ok = AddProductDialog.get_product_info(self)
if ok:
# 添加商品信息
self.db_window.add_product('photo.jpg', name, price)
class DatabaseWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建控件
self.table = QTableWidget(self)
self.button = QPushButton('添加商品', self)
# 设置控件位置和大小
self.table.setGeometry(0, 0, 640, 480)
self.button.setGeometry(270, 490, 100, 30)
# 创建数据库
self.db = QSqlDatabase.addDatabase('QSQLITE')
self.db.setDatabaseName('products.db')
self.db.open()
# 创建表格
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(['图片', '名称', '单价'])
def add_product(self, filename, name, price):
# 添加商品信息到数据库
query = QSqlQuery()
query.prepare('INSERT INTO products (filename, name, price) VALUES (?, ?, ?)')
query.addBindValue(filename)
query.addBindValue(name)
query.addBindValue(price)
query.exec_()
# 添加商品信息到表格
row = self.table.rowCount()
self.table.setRowCount(row+1)
self.table.setItem(row, 0, QTableWidgetItem(QIcon(filename), ''))
self.table.setItem(row, 1, QTableWidgetItem(name))
self.table.setItem(row, 2, QTableWidgetItem(str(price)))
class AddProductDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
# 创建控件
self.name_edit = QLineEdit(self)
self.price_edit = QLineEdit(self)
self.ok_button = QPushButton('确定', self)
self.cancel_button = QPushButton('取消', self)
# 设置控件位置和大小
self.name_edit.setGeometry(60, 20, 200, 30)
self.price_edit.setGeometry(60, 60, 200, 30)
self.ok_button.setGeometry(60, 100, 80, 30)
self.cancel_button.setGeometry(180, 100, 80, 30)
# 设置对话框大小和标题
self.resize(300, 150)
self.setWindowTitle('添加商品信息')
# 添加信号槽
self.ok_button.clicked.connect(self.accept)
self.cancel_button.clicked.connect(self.reject)
@staticmethod
def get_product_info(parent=None):
dialog = AddProductDialog(parent)
result = dialog.exec_()
name = dialog.name_edit.text()
price = dialog.price_edit.text()
return name, price, result == QDialog.Accepted
if __name__ == '__main__':
app = QApplication(sys.argv)
# 创建拍照界面和数据库界面
camera_widget = CameraWidget()
db_window = DatabaseWindow()
camera_widget.db_window = db_window
# 添加商品按钮
camera_widget.button.clicked.connect(camera_widget.take_photo)
db_window.button.clicked.connect(AddProductDialog.get_product_info)
# 显示拍照界面
camera_widget.show()
sys.exit(app.exec_())
```
在这个代码中,我们还添加了一个AddProductDialog类,用来实现添加商品信息的对话框。在拍照界面中,当用户拍照后会弹出这个对话框让用户输入商品名称和单价。当用户输入完毕后,可以点击确定按钮将商品信息添加到数据库和表格中。
这个项目比较复杂,代码量比较大,但是我们可以逐步实现。
阅读全文