Qt Designer
1. Qt Designer安装
pip install pyqt5
pip install PyQt5-tools
在此网站安装Qt Designer,pycharm环境配置参考此文章
可使用下面的命令将 ui 文件转换为 python 代码:
pyuic5 MainWindow.ui -o MainWindow.py
2. 计算器功能实例
Qt designer页面简介看此,关于布局看此和此,GUI官方文档
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow
from MainWindow import Ui_MainWindow
class MyWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.disp)
self.pushButton_2.clicked.connect(self.disp2)
self.pushButton_3.clicked.connect(self.disp3)
self.pushButton_4.clicked.connect(self.disp4)
self.pushButton_5.clicked.connect(self.disp5)
self.pushButton_6.clicked.connect(self.disp6)
self.pushButton_7.clicked.connect(self.disp7)
self.pushButton_8.clicked.connect(self.disp8)
self.pushButton_9.clicked.connect(self.disp9)
self.pushButton_10.clicked.connect(self.disp10)
self.pushButton_11.clicked.connect(self.disp11)
self.pushButton_12.clicked.connect(self.disp12)
self.pushButton_13.clicked.connect(self.disp13)
self.pushButton_14.clicked.connect(self.disp14)
self.pushButton_15.clicked.connect(self.disp15)
self.pushButton_16.clicked.connect(self.disp16)
def disp(self):
self.textEdit.insertPlainText('1')
def disp2(self):
self.textEdit.insertPlainText('2')
def disp3(self):
self.textEdit.insertPlainText('3')
def disp4(self):
self.textEdit.insertPlainText('4')
def disp5(self):
self.textEdit.insertPlainText('5')
def disp6(self):
self.textEdit.insertPlainText('6')
def disp7(self):
self.textEdit.insertPlainText('7')
def disp8(self):
self.textEdit.insertPlainText('8')
def disp9(self):
self.textEdit.insertPlainText('9')
def disp10(self):
self.textEdit.insertPlainText('0')
def disp11(self):
self.textEdit.insertPlainText('+')
def disp12(self):
self.textEdit.insertPlainText('-')
def disp13(self):
self.textEdit.insertPlainText('*')
def disp14(self):
self.textEdit.insertPlainText('/')
def disp15(self):
self.textEdit.clear()
def disp16(self):
text = self.textEdit.toPlainText()
text = eval(text)
self.textEdit.insertPlainText('\n\n')
self.textEdit.setAlignment(Qt.AlignRight)
self.textEdit.insertPlainText(str(text))
print(text)
if __name__ == '__main__':
# application 对象
app = QApplication(sys.argv)
# QMainWindow对象
# mainwindow = QMainWindow()
# 这是qt designer实现的Ui_MainWindow类
# ui_components = Ui_MainWindow() # 继承-Ui_MainWindow类
# 调用setupUi()方法,注册到QMainWindow对象
# ui_components.setupUi(mainwindow)
mainwindow = MyWindow()
mainwindow.show() # 显示
sys.exit(app.exec_())
3. 播放视频 滑块控制进度
qt官方文档,player.py,这两没什么用,主要参考此文章,修改与踩坑:
- 解决Qt播放视频无法播放的问题
- 播放视频需要在qt designer promoted classes
- 解决滑块条的问题
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
from MainWindow import Ui_MainWindow
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtCore import QUrl
from myVideoWidget import myVideoWidget
class MyWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.setupUi(self)
self.videoFullScreen = False # 判断当前widget是否全屏
self.videoFullScreenWidget = myVideoWidget() # 创建一个全屏的widget
self.videoFullScreenWidget.setFullScreen(1)
self.videoFullScreenWidget.hide() # 不用的时候隐藏起来
self.player = QMediaPlayer()
self.player.setVideoOutput(self.wgt_video)
self.btn_open.clicked.connect(self.openVideoFile)
self.btn_play.clicked.connect(self.playVideo) # play
self.btn_stop.clicked.connect(self.pauseVideo)
self.sld_video.sliderMoved.connect(self.changeVideo)
self.player.positionChanged.connect(self.changeSlide)
def openVideoFile(self):
# self.player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0])) # 手动选取视频文件
self.player.setMedia(QMediaContent(QUrl.fromLocalFile('...your path/大学物理典型问题解析—力学与热学 第5讲 牛顿运动定律及其应用-1/1牛顿运动定理简要回顾.mp4')))
self.player.play()
def playVideo(self):
self.player.play()
def pauseVideo(self):
self.player.pause()
def changeSlide(self, position):
self.vidoeLength = self.player.duration() + 0.1
self.sld_video.setValue(round((position / self.vidoeLength) * 100))
self.lab_video.setText(str(round((position / self.vidoeLength) * 100, 2)) + '%')
def changeVideo(self, position):
self.vidoeLength = self.player.duration() + 0.1
self.player.setPosition(round((position/100 )* self.vidoeLength))
if __name__ == '__main__':
app = QApplication(sys.argv) # application 对象
mainwindow = MyWindow()
mainwindow.show() # 显示
# player = QMediaPlayer()
# vw = QVideoWidget() # 定义视频显示的widget
# vw.show()
# player.setVideoOutput(vw) # 视频播放输出的widget,就是上面定义的
# player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0])) # 选取视频文件
# player.play() # 播放视频
sys.exit(app.exec_())
4. 实现字幕与视频同步
关于这个一开始需要加0.1的问题不大,不管它,看一下总时长:
self.vidoeLength = self.player.duration() + 0.1
print(self.player.duration(), self.vidoeLength)
结果:
0 0.1
301080 301080.1
可见单位就是ms
在main
函数中添加:
begin_list = []
end_list = []
text_list = []
text_path = '...your path/大学物理典型问题解析—力学与热学 第5讲 牛顿运动定律及其应用-1/1牛顿运动定理简要回顾.txt'
file = open(text_path, 'r', encoding='utf-8')
for line in file.readlines():
line = line.strip('\n').split(' ')
begin_list.append(eval(line[0]))
end_list.append(eval(line[1]))
text_list.append(line[2])
file.close()
在changeSlide(self, position)
函数中添加:
# 改变当前文本
for i in range(len(begin_list)):
if position >= begin_list[i] and position <= end_list[i]:
self.lab_text.setText(text_list[i])
5. 显示图片
参考官方文档,拖入Label,在changeSlide(self, position)
函数中添加:
# 显示图像
from PyQt5.QtGui import QPixmap
pixmap = QPixmap('C:/Users/Yang SiCheng/Videos/Captures/Screenshot 1_20_2021 8_53_20 PM.png')
self.lab_emo_image.setScaledContents(True) # 缩放
self.lab_emo_image.setPixmap(pixmap)
插值法绘制平滑曲线:此文、此文,Savitzky-Golay 滤波器实现曲线平滑见此文
6. 显示matplotlib.pyplot生成的图片
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from MainWindow import Ui_MainWindow
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QPixmap
from myVideoWidget import myVideoWidget
import numpy as np
from gensim.models import KeyedVectors
word_vectors = KeyedVectors.load('vectors.kv')
def get_sentence_vec(sentence):
import jieba
import re
sentence = ''.join(re.findall('[\u4e00-\u9fa5|\n]',sentence))
sentence_list = ' '.join(jieba.cut(sentence)).split(' ')
vecsum = np.zeros(word_vectors.vector_size)
cnt = 0
for word in sentence_list:
try:
vecsum = vecsum + word_vectors[word]
cnt += 1
except:
continue
if cnt == 0: return vecsum
return vecsum/cnt
begin_list = []
end_list = []
text_list = []
test_data = []
text_path = '...your path/大学物理典型问题解析—力学与热学 第5讲 牛顿运动定律及其应用-1/1牛顿运动定理简要回顾.txt'
file = open(text_path, 'r', encoding='utf-8')
for line in file.readlines():
line = line.strip('\n').split(' ')
begin_list.append(eval(line[0]))
end_list.append(eval(line[1]))
text_list.append(line[2])
test_data.append(get_sentence_vec(line[2]))
file.close()
x = []
y = []
import matplotlib.pyplot as plt
def plot_proba(i, pos_proba, begin_list=begin_list, end_list=end_list):
x.append((end_list[i]+begin_list[i])/2)
y.append(pos_proba)
import joblib
model = joblib.load('sgd_model_5.m')
predict = model.predict(test_data)
# predict = Norm(test_data,predict)
#
# print(len(predict) == len(test_data))
# for i in range(len(text_list)):
# print(text_list[i], predict[i])
def emotion_convert(string):
dictionary = {
1: 'POS',
-1: 'NEG',
0: 'NORM'
}
return dictionary.get(string, None)
def Norm(i, test_data, predict2): # 置信度低于某值时认为为平淡
global x, y
uncertain_classification = 0
proba = model.predict_proba(test_data)
for j in range(0, len(predict2)): # 对于每一个句子
plot_proba(j, proba[j][1])
if proba[j][0] < 0.8 and proba[j][1] < 0.8:
# print('置信度低于0.8:%d' % i)
uncertain_classification += 1
predict2[j] = 0
continue
plt.figure(1)
plt.ylim(0,1)
plt.bar(x=begin_list[i], height=proba[i][1], width=end_list[i] - begin_list[i], align='edge')
plt.savefig('1.jpg')
plt.figure(4)
plt.ylim(0, 1)
plt.bar(x=begin_list[i], height=proba[i][0], width=end_list[i] - begin_list[i], align='edge')
plt.savefig('4.jpg')
plt.figure(2)
plt.plot(x, y, 'r', linewidth='1')
plt.savefig('2.jpg')
plt.clf()
# from scipy.interpolate import make_interp_spline
# import numpy as np
# x_smooth = np.linspace(np.array(x).min(),np.array(x).max(),1000)
# y_smooth = make_interp_spline(x, y)(x_smooth)
from scipy.signal import savgol_filter
x_smooth = x
y_smooth = savgol_filter(y, 25, 3, mode='nearest')
plt.figure(3)
plt.plot(x_smooth, y_smooth, 'r', linewidth='1')
plt.savefig('3.jpg')
plt.clf()
x = []
y = []
del x_smooth
del y_smooth
# plt.show()
# print('总的句子个数为:%d' % len(predict))
# print('平淡的句子个数为:%d' % uncertain_classification)
return predict[i],proba[len(predict2)-1][0],proba[len(predict2)-1][1]
class MyWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.setupUi(self)
self.videoFullScreen = False # 判断当前widget是否全屏
self.videoFullScreenWidget = myVideoWidget() # 创建一个全屏的widget
self.videoFullScreenWidget.setFullScreen(1)
self.videoFullScreenWidget.hide() # 不用的时候隐藏起来
self.player = QMediaPlayer()
self.player.setVideoOutput(self.wgt_video)
self.btn_open.clicked.connect(self.openVideoFile)
self.btn_play.clicked.connect(self.playVideo) # play
self.btn_stop.clicked.connect(self.pauseVideo)
self.sld_video.sliderMoved.connect(self.changeVideo)
self.player.positionChanged.connect(self.changeSlide)
self.lab_emo_image.setScaledContents(True)
self.lab_emo_image2.setScaledContents(True)
self.lab_emo_image3.setScaledContents(True)
self.lab_emo_image_.setScaledContents(True)
def openVideoFile(self):
# self.player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0])) # 手动选取视频文件
self.player.setMedia(QMediaContent(QUrl.fromLocalFile('...your path/大学物理典型问题解析—力学与热学 第5讲 牛顿运动定律及其应用-1/1牛顿运动定理简要回顾.mp4')))
self.player.play()
def playVideo(self):
self.player.play()
def pauseVideo(self):
self.player.pause()
def changeSlide(self, position):
self.vidoeLength = self.player.duration() + 0.1
self.sld_video.setValue(round((position / self.vidoeLength) * 100))
self.lab_video.setText(str(round((position / self.vidoeLength) * 100, 2)) + '%')
# 改变当前文本
for i in range(len(begin_list)):
if position >= begin_list[i] and position <= end_list[i]:
self.lab_text.setText(text_list[i])
Class, neg_proba, pos_proba = Norm(i, test_data[:i+1], predict[:i+1])
# Norm(i, test_data[:i + 1], predict[:i + 1])
self.lab_emo_image.setPixmap(QPixmap('1.jpg'))
self.lab_emo_image2.setPixmap(QPixmap('2.jpg'))
self.lab_emo_image3.setPixmap(QPixmap('3.jpg'))
self.lab_emo_image_.setPixmap(QPixmap('4.jpg'))
self.label_class.setText(emotion_convert(Class))
self.lab_pos_proba.setText(str(pos_proba))
self.lab_neg_proba.setText(str(neg_proba))
# 显示图像
# pixmap = QPixmap('C:/Users/Yang SiCheng/Videos/Captures/Screenshot 1_20_2021 8_53_20 PM.png')
# self.lab_emo_image.setScaledContents(True) # 缩放
# self.lab_emo_image.setPixmap(pixmap)
# 显示matplotlib.pyplot生成的图片
def changeVideo(self, position):
self.player.setPosition(round((position/100 )* self.vidoeLength))
if __name__ == '__main__':
app = QApplication(sys.argv) # application 对象
mainwindow = MyWindow()
mainwindow.show() # 显示
sys.exit(app.exec_())
小结
使用qt designer实现播放视频、滑块进度条、导入语音识别的文本内容、根据之前的NLP过程产生的情绪识别模型进行数据可视化,结果良好
未来工作:
- NLP文本匹配度
- DS融合原理和实现
- NLP文本匹配数据可视化