使用QSplitter将界面分为左右两个部分,左边使用QVBoxLayout布局,右边使用QStackedLayout布局。在左边的布局中添加四个QPushButton按钮,分别对应“首页”、“门铃”、“语言留言”和“语音信箱”。 对于“首页”按钮,你可以添加一个QLabel控件用于显示当前时间和天气预报。 对于“门铃”按钮,你可以使用OpenCV库进行人脸检测,如果检测到危险人物可以播放报警声,否则可以播放门铃音乐。可以使用QMediaPlayer控件进行音乐播放。 对于“语言留言”按钮,你可以添加两个QPushButton按钮,分别对应开始录音和结束录音。可以使用PyAudio库进行录音,录音完成后可以弹出一个提示框,提示留言成功。 对于“语音信箱”按钮,你可以添加一个QLineEdit控件用于填写用户名和密码,以及一个QPushButton按钮用于登录。登录成功后可以使用QListWidget控件显示语音列表,在列表中点击一条语音即可播放。编写pyqt5代码
时间: 2024-02-26 17:53:07 浏览: 35
以下是一个简单的实现,其中涉及到的音乐文件和报警声需要自行添加。请注意,这个程序只是一个示例,实际情况需要根据自己的需要进行修改。
```
import cv2
import pyaudio
import wave
import requests
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QPushButton, QLabel, QStackedLayout, QSplitter, \
QLineEdit, QListWidget, QListWidgetItem, QMessageBox
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
class FaceDetector(QThread):
detected = pyqtSignal(bool)
def run(self):
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
if len(faces) > 0:
self.detected.emit(True)
break
cap.release()
class RecordThread(QThread):
finished = pyqtSignal()
def __init__(self, file_name, parent=None):
super().__init__(parent)
self.file_name = file_name
def run(self):
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(self.file_name, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
self.finished.emit()
class ChitGPT(QWidget):
def __init__(self):
super().__init__()
self.left_widget = QWidget()
self.right_widget = QWidget()
self.init_left_widget()
self.init_right_widget()
splitter = QSplitter(Qt.Horizontal)
splitter.addWidget(self.left_widget)
splitter.addWidget(self.right_widget)
layout = QHBoxLayout(self)
layout.addWidget(splitter)
def init_left_widget(self):
layout = QVBoxLayout(self.left_widget)
self.label = QLabel(self.left_widget)
layout.addWidget(self.label)
btn_home = QPushButton('首页', self.left_widget)
layout.addWidget(btn_home)
btn_doorbell = QPushButton('门铃', self.left_widget)
layout.addWidget(btn_doorbell)
btn_message = QPushButton('语言留言', self.left_widget)
layout.addWidget(btn_message)
btn_voice = QPushButton('语音信箱', self.left_widget)
layout.addWidget(btn_voice)
btn_home.clicked.connect(self.show_weather)
btn_doorbell.clicked.connect(self.check_face)
btn_message.clicked.connect(self.record_message)
btn_voice.clicked.connect(self.show_voice_list)
def init_right_widget(self):
layout = QStackedLayout(self.right_widget)
login_widget = QWidget(self.right_widget)
login_layout = QVBoxLayout(login_widget)
self.username_edit = QLineEdit(login_widget)
login_layout.addWidget(self.username_edit)
self.password_edit = QLineEdit(login_widget)
self.password_edit.setEchoMode(QLineEdit.Password)
login_layout.addWidget(self.password_edit)
btn_login = QPushButton('登录', login_widget)
login_layout.addWidget(btn_login)
btn_login.clicked.connect(self.login)
voice_list_widget = QListWidget(self.right_widget)
voice_list_widget.itemClicked.connect(self.play_voice)
layout.addWidget(login_widget)
layout.addWidget(voice_list_widget)
def show_weather(self):
r = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京')
weather_data = r.json().get('data')
if weather_data:
temperature = weather_data.get('wendu')
weather = weather_data.get('ganmao')
self.label.setText(f'温度:{temperature}℃,{weather}')
else:
self.label.setText('获取天气信息失败')
def check_face(self):
detector = FaceDetector(self)
detector.detected.connect(self.play_music)
detector.start()
def play_music(self, detected):
if detected:
player = QMediaPlayer(self)
player.setMedia(QMediaContent(QUrl.fromLocalFile('alarm.mp3')))
player.play()
else:
player = QMediaPlayer(self)
player.setMedia(QMediaContent(QUrl.fromLocalFile('doorbell.mp3')))
player.play()
def record_message(self):
file_name = 'message.wav'
thread = RecordThread(file_name, self)
thread.finished.connect(lambda: QMessageBox.information(self, '提示', '留言成功'))
thread.start()
def show_voice_list(self):
self.right_widget.layout().setCurrentIndex(1)
voice_list_widget = self.right_widget.layout().currentWidget()
voice_list_widget.clear()
# TODO: 显示语音列表
def login(self):
# TODO: 登录验证
self.right_widget.layout().setCurrentIndex(1)
def play_voice(self, item: QListWidgetItem):
# TODO: 播放语音
pass
if __name__ == '__main__':
app = QApplication([])
chit = ChitGPT()
chit.show()
app.exec_()
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)