97wz小说下载:python3GUI--在线小说播放器By:PyQt5(附ui源码)

文章目录

  • 一.准备工作
    • 1.PyQt5
    • 2.qtawesome
    • 3.QMediaPlayer
    • 4.LAVFilters
  • 二.预览
    • 1.启动
    • 2.查看小说详情&播放小说
    • 3.搜索后播放
    • 4.动态演示
  • 三.设计流程
    • 1.UI设计
    • 2.整体流程设计
  • 四.源代码
    • 1.Novel_Listen.py(主程序调用)
    • 2.小说搜索UI.py(UI界面)
  • 五.总结


本次使用PyQt5开发一款在线小说播放器,支持在线收听多个数据源的小说,支持小说检索,走起~

一.准备工作

1.PyQt5

pyqt5是一套Python绑定Digia QT5应用的框架。它可用于Python 2和3。本教程使用Python 3。Qt库是最强大的GUI库之一。pyqt5的官方网站http://www.riverbankcomputing.co.uk/news。
pyqt5做为Python的一个模块,它有620多个类和6000个函数和方法。这是一个跨平台的工具包,它可以运行在所有主要的操作系统,包括UNIX,Windows,Mac OS。pyqt5是双重许可。开发者可以在GPL和商业许可之间进行选择。

2.qtawesome

QtAwesome 是一个简单的库,可用于将Font Awesome图标添加到Qt 应用程序。
注意:虽然名称是 QtAwesome 并且目前它非常基于 Font Awesome,但您可以使用您想要的所有其他图标/字形字体。
通过添加命名图标画家,该类还可用于管理您自己的动态代码绘制图标。(翻译)

简单说,就是利用qtawesome里面的小图标组件,帮助我们可视化地设计GUI界面。

给出三个网站,可以学习一下
QtAwesome-GitHub
Font Awesome-官网
Font Awesome-中文网

3.QMediaPlayer

QMediaPlayer 类是高级媒体播放类。它可用于播放歌曲、电影和网络广播等内容。要播放的内容被指定为 QMediaContent 对象,可以将其视为附加了附加信息的主 URL 或规范 URL。当提供了一个 QMediaContent 播放可能就可以开始了。
QMediaPlayer-Qt官网
QMediaPlayer-PyQt官网

本文利用QMediaPlayer播放在线小说音频,运用其封装好的函数对播放器进行控制。

4.LAVFilters

LAV Filters是一组基于 ffmpeg 项目中的 libavformat/libavcodec 库的 directshow 分离器和音视频解码器,几乎允许在 directshow 播放器中播放任何格式的媒体文件!
LAVFilters-GitHub

考虑到小说文件格式不同,在此需要安装解码器。可以去GitHub下载,也可以去网络上搜索后下载。

二.预览

1.启动

启动后会自动加载推荐的小说,并且显示数量,此时播放器以及右边详情页、剧集页为默认状态。

2.查看小说详情&播放小说

点击左侧小说列表,查看小说详情、剧集。选择双击小说剧集,播放器开始播放小说,播放模式默认为列表顺序播放,可以手动拖动播放进度条,改变当前播放进度。

3.搜索后播放


搜索小说后,播放小说。

4.动态演示


本程序UI设计并不复杂,左侧小说推荐、小说搜索Table Widget和右侧小说详情、小说剧集水平布局,最后再和下面播放器垂直布局。

2.整体流程设计

四.源代码

1.Novel_Listen.py(主程序调用)

import sysimport threadingimport qtawesomefrom novel_get import *from PyQt5.QtCore import *from base64 import b64decodefrom PyQt5.QtGui import QIconfrom PyQt5.uic import loadUifrom 小说搜索UI import MainWindowfrom PyQt5.QtWidgets import QTableWidgetItemfrom PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QMediaPlaylistfrom PyQt5.Qt import QMainWindow,QMessageBox,QApplication,QPixmap,QUrlclass Listen_Sound_Window(QMainWindow): load_recommend_finish_single=pyqtSignal() def __init__(self): super().__init__() self.ui=MainWindow() self.ui.setupUi(self) self.thread_it(self.load_recommend_novels) self.player_init() self.icon_init() self.ui.pushButton.clicked.connect(self.search_novels) self.ui.pushButton_8.clicked.connect(self.do_sq_and_zk) self.ui.pushButton_5.clicked.connect(lambda :self.get_appoint_audio_play_link("up")) self.ui.pushButton_6.clicked.connect(lambda :self.get_appoint_audio_play_link("down")) self.ui.label_4.setMaximumSize(QSize(300,250))#图片缩放,还有问题 for i in range(1,8): exec("self.ui.tableWidget_{}.currentCellChanged.connect(self.show_novel_detail)".format(i)) self.load_recommend_finish_single.connect(self.display_recommend) def icon_init(self): self.ui.pushButton_8.setIcon(QIcon(qtawesome.icon('fa.angle-double-down', color='black'))) self.ui.pushButton_2.setIcon(QIcon(qtawesome.icon('fa.play', color='black'))) self.ui.pushButton_3.setIcon(QIcon(qtawesome.icon('fa.pause', color='black'))) self.ui.pushButton_4.setIcon(QIcon(qtawesome.icon('fa.stop', color='black'))) self.ui.pushButton_5.setIcon(QIcon(qtawesome.icon('fa.backward', color='black'))) self.ui.pushButton_6.setIcon(QIcon(qtawesome.icon('fa.forward', color='black'))) self.ui.pushButton_7.setIcon(QIcon(qtawesome.icon('fa.volume-down', color='black'))) self.default_img=b'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' self.default_img_base64=b64decode(self.default_img) def do_sq_and_zk(self): """ 播放区,收起 展开 :return: """ state=self.ui.frame_7.isVisible() self.ui.frame_7.setVisible(not state) if state: self.ui.pushButton_8.setIcon(QIcon(qtawesome.icon('fa.angle-double-up', color='black'))) self.ui.pushButton_8.setText("展开") else: self.ui.pushButton_8.setText("收起") self.ui.pushButton_8.setIcon(QIcon(qtawesome.icon('fa.angle-double-down', color='black'))) def load_recommend_novels(self): """ 加载推荐小说 :return: """ self.ting_China_recommend_list=Ting_China_spider().get_recommend() self.youshengxiaoshuo_recommend_list=YouSheng_xiaoshuo_spider().get_recommend() self.tingshubao_recommend_list=Tingshu_bao_spider().get_recommend() self.i275_recommend_list=I275_spider().get_recommend() self.tingshucn_recommend_list=Tingshu_cn_spider().get_recommend() self.mangguoting_recommend_list=Mangguo_ting_spider().get_recommend() self.load_recommend_finish_single.emit() def display_recommend(self): if self.ting_China_recommend_list: book_num=len(self.ting_China_recommend_list) self.ui.groupBox.setTitle(f"听China({book_num})") self.ui.tableWidget_1.setRowCount(book_num) for index, novel_item in enumerate(self.ting_China_recommend_list): novel_name = novel_item['novel_name'] table_widget_item = QTableWidgetItem(novel_name) self.ui.tableWidget_1.setItem(index, 0, table_widget_item) if self.youshengxiaoshuo_recommend_list: book_num=len(self.youshengxiaoshuo_recommend_list) self.ui.groupBox_2.setTitle(f"有声小说({book_num})") self.ui.tableWidget_2.setRowCount(book_num) for index,novel_item in enumerate(self.youshengxiaoshuo_recommend_list): novel_name=novel_item['novel_name'] table_widget_item=QTableWidgetItem(novel_name) self.ui.tableWidget_2.setItem(index,0,table_widget_item) if self.tingshubao_recommend_list: book_num=len(self.tingshubao_recommend_list) self.ui.groupBox_3.setTitle(f"听书宝({book_num})") self.ui.tableWidget_3.setRowCount(book_num) for index,novel_item in enumerate(self.tingshubao_recommend_list): novel_name=novel_item['novel_name'] table_widget_item=QTableWidgetItem(novel_name) self.ui.tableWidget_3.setItem(index,0,table_widget_item) if self.i275_recommend_list: book_num=len(self.i275_recommend_list) self.ui.groupBox_4.setTitle(f"I2725({book_num})") self.ui.tableWidget_4.setRowCount(book_num) for index,novel_item in enumerate(self.i275_recommend_list): novel_name=novel_item['novel_name'] table_widget_item=QTableWidgetItem(novel_name) self.ui.tableWidget_4.setItem(index,0,table_widget_item) if self.tingshucn_recommend_list: book_num=len(self.tingshucn_recommend_list) self.ui.groupBox_5.setTitle(f"听书cn({book_num})") self.ui.tableWidget_5.setRowCount(book_num) for index,novel_item in enumerate(self.tingshucn_recommend_list): novel_name=novel_item['novel_name'] table_widget_item=QTableWidgetItem(novel_name) self.ui.tableWidget_5.setItem(index,0,table_widget_item) if self.mangguoting_recommend_list: book_num=len(self.mangguoting_recommend_list) self.ui.groupBox_6.setTitle(f"芒果听({book_num})") self.ui.tableWidget_6.setRowCount(book_num) for index,novel_item in enumerate(self.mangguoting_recommend_list): novel_name=novel_item['novel_name'] table_widget_item=QTableWidgetItem(novel_name) self.ui.tableWidget_6.setItem(index,0,table_widget_item) def search_novels(self): key_word=self.ui.lineEdit.text() if key_word!="": combobox_current_index=self.ui.comboBox.currentIndex() if combobox_current_index!=0: self.current_page=0 self.current_keyword=key_word self.do_search_novels(index=combobox_current_index,key_word=key_word) else: QMessageBox.warning(self,"警告","请选择音源!") else: QMessageBox.warning(self, "警告", "关键字不能为空!") def get_spider(self,index): if index==1: spider=Ting_China_spider() elif index==2: spider=YouSheng_xiaoshuo_spider() elif index==3: spider=Tingshu_bao_spider() elif index==4: spider=I275_spider() elif index==5: spider=Tingshu_cn_spider() elif index==6: spider=Mangguo_ting_spider() return spider def do_search_novels(self,index,key_word): spider=self.get_spider(index) self.search_result_list=[] search_result = spider.do_search(key_word=key_word) if search_result: page = 2 while True: self.search_result_list.extend(search_result['search_result_list']) if search_result['next_page_flag']==True: search_result = spider.do_search(key_word=key_word,page=page) if search_result: self.search_result_list.extend(search_result['search_result_list']) page+=1 else: break else: break if page==6: #仅展示前5页 break novel_num=len(self.search_result_list) self.ui.tableWidget_7.setRowCount(novel_num) if novel_num==1: #如果只有一个搜索结果,则直接选中此单元格 self.ui.tableWidget_7.setCurrentCell(0,0) self.ui.label_3.setText('<html><head/><body><p align="center">{current_status}</p></body></html>'.replace("{current_status}",f'搜索到关于<span style=" color:#55aaff;">{self.current_keyword}</span>的小说<span style=" color:#55aaff;">{novel_num}</span>本')) self.show_search_result() else: QMessageBox.information(self,"提示",f"没有搜索到关于{self.current_keyword}的小说,请尝试更换关键字或更换音源") def show_search_result(self): """ :return: """ for index,item in enumerate(self.search_result_list): new_table_widget_item=QTableWidgetItem(item['novel_name']) self.ui.tableWidget_7.setItem(index,0,new_table_widget_item) def show_novel_detail(self,row,column): """ 所有tablewidget :param row: :param column: :return: """ if self.sender()==self.ui.tableWidget_1: spider=Ting_China_spider() current_sound_link=self.ting_China_recommend_list[row]['novel_link'] elif self.sender()==self.ui.tableWidget_2: spider=YouSheng_xiaoshuo_spider() current_sound_link=self.youshengxiaoshuo_recommend_list[row]['novel_link'] elif self.sender()==self.ui.tableWidget_3: spider=Tingshu_bao_spider() current_sound_link=self.tingshubao_recommend_list[row]['novel_link'] elif self.sender()==self.ui.tableWidget_4: spider=I275_spider() current_sound_link=self.i275_recommend_list[row]['novel_link'] elif self.sender()==self.ui.tableWidget_5: spider=Tingshu_cn_spider() current_sound_link=self.tingshucn_recommend_list[row]['novel_link'] elif self.sender()==self.ui.tableWidget_6: spider=Mangguo_ting_spider() current_sound_link=self.mangguoting_recommend_list[row]['novel_link'] elif self.sender()==self.ui.tableWidget_7: current_sound_link=self.search_result_list[row]['novel_link'] index=self.ui.comboBox.currentIndex() spider=self.get_spider(index) novel_detail=spider.get_novel_detail(current_sound_link) self.do_show_novel_detail(novel_detail) def do_show_novel_detail(self,novel_detail): novel_cover_link=novel_detail['novel_cover'] pix_map = QPixmap() if novel_cover_link=="未知": img_bytes=b64decode(self.default_img) else: res=Sound_Get().do_get_img_bytes(novel_cover_link) if res: header_type=res[1] if "html" in header_type: img_bytes = self.default_img_base64 else: img_bytes=res[0] else: img_bytes = self.default_img_base64 pix_map.loadFromData(img_bytes) self.ui.label_4.setPixmap(pix_map) self.ui.label_4.resize(200,150) play_list=novel_detail['play_list'] self.__play_list=play_list self.current_play_novel_name=novel_detail['novel_name'] self.ui.label_6.setText(novel_detail['novel_name']) self.ui.label_8.setText(novel_detail['novel_status']) self.ui.label_10.setText(novel_detail['novel_author']) self.ui.label_12.setText(novel_detail['novel_anchor']) self.ui.label_22.setText(novel_detail['novel_type']) self.ui.label_24.setText(novel_detail['novel_update_time']) clean_res=self.string_clean(novel_detail['novel_introduce'].strip()) if len(clean_res)>120: self.ui.label_25.setText(clean_res[:120]+"......") else: self.ui.label_25.setText(clean_res) self.ui.label_27.setText(f"{len(play_list)}集") self.ui.play_list.setRowCount(len(play_list)) for index,item in enumerate(play_list): novel_name=item['play_name'] new_item=QTableWidgetItem(novel_name) new_item.setToolTip(novel_name) self.ui.play_list.setItem(index,0,new_item) self.ui.play_list.verticalScrollBar().setSliderPosition(1)#将滚动条位置恢复 def string_clean(self,raw_strings): reg=r"[\/\\\:\*\?\"\<\>\|\n|\t|\s]" clean_res=re.sub(reg,"",raw_strings) return clean_res def player_init(self): self.dur='' #当前播放时常 self.cur_dur='' #总时长 self.ui.volume_slider.setValue(100) self.player = QMediaPlayer(self) self.playlist = QMediaPlaylist(self) self.ui.volume_slider.setRange(0, 100) self.player.setPlaylist(self.playlist) self.ui.progress_slider.setEnabled(False) self.playlist.loadFailed.connect(lambda :QMessageBox.critical(self,"错误","此音频不可播放!")) self.ui.volume_slider.valueChanged[int].connect(lambda v :self.player.setVolume(v)) self.player.stateChanged.connect(self.play_state_Change) self.player.durationChanged.connect(self.get_duration_func) self.player.positionChanged.connect(self.get_position_func) self.player.mediaStatusChanged.connect(self.player_status_chnge) self.player.error.connect(self.do_progress_error) self.ui.play_list.itemDoubleClicked.connect(self.do_play_novel) self.ui.progress_slider.sliderMoved.connect(self.update_position_func) self.ui.volume_slider.valueChanged.connect(self.volume_slider_func) self.ui.pushButton_2.clicked.connect(self.do_start_play) self.ui.pushButton_5.clicked.connect(lambda :self.playlist.previous()) self.ui.pushButton_6.clicked.connect(lambda :self.playlist.next()) self.ui.pushButton_3.clicked.connect(lambda :self.player.pause()) self.ui.pushButton_4.clicked.connect(lambda :self.player.stop()) self.ui.pushButton_7.clicked.connect(self.on_mute_clicked) def do_progress_error(self,error): if error==1: QMessageBox.critical(self,"错误",'请检查资源!') elif error==3: QMessageBox.critical(self,"错误",'网络错误!') elif error==5: QMessageBox.critical(self,"错误",'缺少相关服务!') elif error==2: QMessageBox.critical(self,"错误",'格式错误!') elif error==4: QMessageBox.critical(self,"错误",'访问权限错误!') def get_appoint_audio_play_link(self,direction): """ 获取指定音频播放地址,此函数用于“上一集”,“下一集”,“切换” :param index: :return: """ if direction=='up': if self.current_select_row-1<=0: QMessageBox.warning(self,'警告','前面没有啦!') return else: self.current_select_row-=1 elif direction=="down": if self.current_select_row+1>=len(self.__play_list): QMessageBox.warning(self,'警告','后面没有啦!') return else: self.current_select_row+=1 real_play_link=self.get_real_play_link(self.__play_list[self.current_select_row]['play_link']) print(real_play_link) self.do_play_a_aduio(real_play_link) def do_play_a_aduio(self,play_link): """ 根据传入播放链接,播放指定音频 :param play_link: :return: """ if play_link: novel = QMediaContent(QUrl(play_link)) self.playlist.clear() self.playlist.addMedia(novel) self.playlist.setPlaybackMode(QMediaPlaylist.CurrentItemOnce) # 当前音频播放一次 self.ui.label_play_state.setText( '<html><head/><body><p>正在播放\t<span style=" color:#55aaff;">{current_state_string}</span></p></body></html>'.replace( "{current_state_string}", f"{self.current_play_novel_name}\t{self.__play_list[self.current_select_row]['play_name']}")) self.playlist.setCurrentIndex(0) self.player.play() else: QMessageBox.information(self, "提示", "音频播放失败!") def do_play_novel(self,begin_index): """ 双击剧集tablewidget触发事件 :param begin_index: :return: """ self.current_select_row=begin_index.row() real_play_link=self.get_real_play_link(self.__play_list[self.current_select_row]['play_link']) if isinstance(real_play_link,list): #单独为spider2写一种获取播放链接 real_play_link=real_play_link[self.current_select_row] split_list=real_play_link.split('/',3) suffix=split_list[-1] reg=r'[\u4e00-\u9fa5]+' #如果url包含中文,则转为urlencode if re.match(reg,suffix): real_play_link=split_list[0]+"://"+split_list[2]+"/"+quote(suffix) else: real_play_link=real_play_link else: real_play_link=real_play_link self.do_play_a_aduio(real_play_link) @pyqtSlot() def do_start_play(self): if self.playlist.currentIndex()<0: self.playlist.setCurrentIndex(0) self.player.play() def get_real_play_link(self,link): if "tingchina.com" in link: spider=Ting_China_spider() elif "m.ysxs8.com" in link: spider=YouSheng_xiaoshuo_spider() elif "m.tingshubao.com" in link: spider=Tingshu_bao_spider() elif "www.i275.com" in link: spider=I275_spider() elif "www.tingshucn.com" in link: spider=Tingshu_cn_spider() elif "www.mgting.com" in link: spider=Mangguo_ting_spider() real_play_link=spider.get_audio_play_link(link) if real_play_link: return real_play_link else: return False @pyqtSlot() def on_mute_clicked(self): """ 静音 :return: """ mute=self.player.isMuted() self.player.setMuted(not mute) if mute: #显示音量图标 self.ui.pushButton_7.setIcon(QIcon(qtawesome.icon('fa.volume-down', color='black'))) self.ui.pushButton_7.setText("静音") self.ui.volume_slider.setValue(100) self.player.setVolume(100) else: #显示静音图标 self.ui.pushButton_7.setIcon(QIcon(qtawesome.icon('fa.volume-off', color='black'))) self.ui.pushButton_7.setText("取消静音") self.ui.volume_slider.setValue(0) def play_state_Change(self,state): self.ui.pushButton_2.setEnabled(state!=1) self.ui.pushButton_4.setEnabled(state==1) if state==2: self.ui.label_play_state.setText( '<html><head/><body><p>暂停播放\t<span style=" color:#55aaff;">{current_state_string}</span></p></body></html>'.replace( "{current_state_string}", f"{self.current_play_novel_name}\t{self.__play_list[self.current_select_row]['play_name']}")) elif state==0: self.ui.label_play_state.setText( '<html><head/><body><p>停止播放\t<span style=" color:#55aaff;">{current_state_string}</span></p></body></html>'.replace( "{current_state_string}", f"{self.current_play_novel_name}\t{self.__play_list[self.current_select_row]['play_name']}")) elif state==1: self.ui.label_play_state.setText( '<html><head/><body><p>正在播放\t<span style=" color:#55aaff;">{current_state_string}</span></p></body></html>'.replace( "{current_state_string}", f"{self.current_play_novel_name}\t{self.__play_list[self.current_select_row]['play_name']}")) def player_status_chnge(self,state): if state==7: #当前音频播放结束,state==7(EndOfMedia) self.get_appoint_audio_play_link("down") def get_duration_func(self, d): secs=d/1000 mins=secs/60 secs=secs%60 self.dur="%d:%d"%(mins,secs) current_progress='{}/{}'.format(self.cur_dur,self.dur) self.ui.label_play_time.setText( '<html><head/><body><p><span style=" color:#55aaff;">{current_progress}</span></p></body></html>'.replace( "{current_progress}", current_progress)) self.ui.progress_slider.setRange(0,d) self.ui.progress_slider.setEnabled(True) def get_position_func(self, p): if (self.ui.progress_slider.isSliderDown()): return self.ui.progress_slider.setValue(p) secs=p/1000 mins=secs/60 secs=secs%60 self.cur_dur="%d:%d"%(mins,secs) current_progress='{}/{}'.format(self.cur_dur,self.dur) self.ui.label_play_time.setText( '<html><head/><body><p><span style=" color:#55aaff;">{current_progress}</span></p></body></html>'.replace( "{current_progress}", current_progress)) def update_position_func(self, v): self.player.setPosition(v) secs = v / 1000 mins = secs / 60 secs = secs % 60 self.cur_dur = "%d:%d" % (mins, secs) current_progress='{}/{}'.format(self.cur_dur,self.dur) self.ui.label_play_time.setText( '<html><head/><body><p><span style=" color:#55aaff;">{current_progress}</span></p></body></html>'.replace( "{current_progress}", current_progress)) @pyqtSlot(int) def volume_slider_func(self, value): self.player.setVolume(value) if value == 0: #静音 self.ui.pushButton_7.setIcon(QIcon('images/sound_off.png')) else: #正常 self.ui.pushButton_7.setIcon(QIcon('images/sound_on.png')) def closeEvent(self,event): reply = QMessageBox.question(self, '关闭', "确定要退出吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if reply == QMessageBox.Yes: self.player.stop() event.accept() else: event.ignore() def keyPressEvent(self, event): if event.key()==Qt.Key.Key_Escape: self.close() def thread_it(self,func,*args): t=threading.Thread(target=func,args=args) t.setDaemon(True) t.start()if __name__ == '__main__': app=QApplication(sys.argv) app.setStyle("Fusion") ui=Listen_Sound_Window() ui.show() sys.exit(app.exec_())

2.小说搜索UI.py(UI界面)

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file '小说搜索UI.ui'## Created by: PyQt5 UI code generator 5.15.4## WARNING: Any manual changes made to this file will be lost when pyuic5 is# run again. Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1496, 810) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) MainWindow.setStyleSheet("QPushButton:hover{\n"" border-color:#55aaff;\n""}\n""\n""QPushButton{ \n"" border: 1px solid ;\n"" border-radius: 4px;\n"" min-height: 25px;\n""}\n""QLineEdit{ \n"" border: 1px solid ;\n"" border-radius: 4px;\n""}\n""QLineEdit:hover{\n"" border-color:#55aaff;\n""}\n""\n""QComboBox { \n"" border: 1px solid ;\n"" border-radius:4px;\n"" min-height: 20px;\n""}\n""QComboBox:hover{\n"" border-color:#55aaff;\n""}\n""/* 下拉列表里的颜色 */\n""QComboBox QAbstractItemView {\n"" border: 2px solid darkgray;\n"" selection-background-color:#1E90FF;\n""}\n""") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout_13 = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout_13.setObjectName("verticalLayout_13") self.horizontalLayout_16 = QtWidgets.QHBoxLayout() self.horizontalLayout_16.setObjectName("horizontalLayout_16") self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth()) self.tabWidget.setSizePolicy(sizePolicy) self.tabWidget.setObjectName("tabWidget") self.tab = QtWidgets.QWidget() self.tab.setObjectName("tab") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab) self.verticalLayout_2.setObjectName("verticalLayout_2") self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.groupBox = QtWidgets.QGroupBox(self.tab) self.groupBox.setObjectName("groupBox") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.groupBox) self.verticalLayout_3.setObjectName("verticalLayout_3") self.tableWidget_1 = QtWidgets.QTableWidget(self.groupBox) self.tableWidget_1.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.tableWidget_1.setAlternatingRowColors(True) self.tableWidget_1.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) self.tableWidget_1.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tableWidget_1.setObjectName("tableWidget_1") self.tableWidget_1.setColumnCount(1) self.tableWidget_1.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.tableWidget_1.setHorizontalHeaderItem(0, item) self.tableWidget_1.horizontalHeader().setStretchLastSection(True) self.verticalLayout_3.addWidget(self.tableWidget_1) self.horizontalLayout_5.addWidget(self.groupBox) self.groupBox_2 = QtWidgets.QGroupBox(self.tab) self.groupBox_2.setObjectName("groupBox_2") self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox_2) self.verticalLayout_4.setObjectName("verticalLayout_4") self.tableWidget_2 = QtWidgets.QTableWidget(self.groupBox_2) self.tableWidget_2.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.tableWidget_2.setAlternatingRowColors(True) self.tableWidget_2.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) self.tableWidget_2.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tableWidget_2.setObjectName("tableWidget_2") self.tableWidget_2.setColumnCount(1) self.tableWidget_2.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.tableWidget_2.setHorizontalHeaderItem(0, item) self.tableWidget_2.horizontalHeader().setStretchLastSection(True) self.verticalLayout_4.addWidget(self.tableWidget_2) self.horizontalLayout_5.addWidget(self.groupBox_2) self.groupBox_3 = QtWidgets.QGroupBox(self.tab) self.groupBox_3.setObjectName("groupBox_3") self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox_3) self.verticalLayout_5.setObjectName("verticalLayout_5") self.tableWidget_3 = QtWidgets.QTableWidget(self.groupBox_3) self.tableWidget_3.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.tableWidget_3.setAlternatingRowColors(True) self.tableWidget_3.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) self.tableWidget_3.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tableWidget_3.setObjectName("tableWidget_3") self.tableWidget_3.setColumnCount(1) self.tableWidget_3.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.tableWidget_3.setHorizontalHeaderItem(0, item) self.tableWidget_3.horizontalHeader().setStretchLastSection(True) self.verticalLayout_5.addWidget(self.tableWidget_3) self.horizontalLayout_5.addWidget(self.groupBox_3) self.verticalLayout_2.addLayout(self.horizontalLayout_5) self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName("horizontalLayout_6") self.groupBox_4 = QtWidgets.QGroupBox(self.tab) self.groupBox_4.setObjectName("groupBox_4") self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.groupBox_4) self.verticalLayout_6.setObjectName("verticalLayout_6") self.tableWidget_4 = QtWidgets.QTableWidget(self.groupBox_4) self.tableWidget_4.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.tableWidget_4.setAlternatingRowColors(True) self.tableWidget_4.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) self.tableWidget_4.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tableWidget_4.setObjectName("tableWidget_4") self.tableWidget_4.setColumnCount(1) self.tableWidget_4.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.tableWidget_4.setHorizontalHeaderItem(0, item) self.tableWidget_4.horizontalHeader().setStretchLastSection(True) self.verticalLayout_6.addWidget(self.tableWidget_4) self.horizontalLayout_6.addWidget(self.groupBox_4) self.groupBox_5 = QtWidgets.QGroupBox(self.tab) self.groupBox_5.setObjectName("groupBox_5") self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.groupBox_5) self.verticalLayout_7.setObjectName("verticalLayout_7") self.tableWidget_5 = QtWidgets.QTableWidget(self.groupBox_5) self.tableWidget_5.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.tableWidget_5.setAlternatingRowColors(True) self.tableWidget_5.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) self.tableWidget_5.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tableWidget_5.setObjectName("tableWidget_5") self.tableWidget_5.setColumnCount(1) self.tableWidget_5.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.tableWidget_5.setHorizontalHeaderItem(0, item) self.tableWidget_5.horizontalHeader().setStretchLastSection(True) self.verticalLayout_7.addWidget(self.tableWidget_5) self.horizontalLayout_6.addWidget(self.groupBox_5) self.groupBox_6 = QtWidgets.QGroupBox(self.tab) self.groupBox_6.setObjectName("groupBox_6") self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.groupBox_6) self.verticalLayout_8.setObjectName("verticalLayout_8") self.tableWidget_6 = QtWidgets.QTableWidget(self.groupBox_6) self.tableWidget_6.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.tableWidget_6.setAlternatingRowColors(True) self.tableWidget_6.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) self.tableWidget_6.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tableWidget_6.setObjectName("tableWidget_6") self.tableWidget_6.setColumnCount(1) self.tableWidget_6.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.tableWidget_6.setHorizontalHeaderItem(0, item) self.tableWidget_6.horizontalHeader().setStretchLastSection(True) self.verticalLayout_8.addWidget(self.tableWidget_6) self.horizontalLayout_6.addWidget(self.groupBox_6) self.verticalLayout_2.addLayout(self.horizontalLayout_6) self.tabWidget.addTab(self.tab, "") self.tab_2 = QtWidgets.QWidget() self.tab_2.setObjectName("tab_2") self.verticalLayout_17 = QtWidgets.QVBoxLayout(self.tab_2) self.verticalLayout_17.setObjectName("verticalLayout_17") self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.label = QtWidgets.QLabel(self.tab_2) self.label.setObjectName("label") self.horizontalLayout_2.addWidget(self.label) self.lineEdit = QtWidgets.QLineEdit(self.tab_2) self.lineEdit.setAlignment(QtCore.Qt.AlignCenter) self.lineEdit.setObjectName("lineEdit") self.horizontalLayout_2.addWidget(self.lineEdit) self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.pushButton = QtWidgets.QPushButton(self.tab_2) self.pushButton.setMinimumSize(QtCore.QSize(120, 27)) self.pushButton.setObjectName("pushButton") self.horizontalLayout_4.addWidget(self.pushButton) self.horizontalLayout_2.addLayout(self.horizontalLayout_4) self.verticalLayout.addLayout(self.horizontalLayout_2) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.label_2 = QtWidgets.QLabel(self.tab_2) self.label_2.setObjectName("label_2") self.horizontalLayout_3.addWidget(self.label_2) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem) self.comboBox = QtWidgets.QComboBox(self.tab_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.comboBox.sizePolicy().hasHeightForWidth()) self.comboBox.setSizePolicy(sizePolicy) self.comboBox.setObjectName("comboBox") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.horizontalLayout_3.addWidget(self.comboBox) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem1) self.verticalLayout.addLayout(self.horizontalLayout_3) self.verticalLayout_17.addLayout(self.verticalLayout) self.frame = QtWidgets.QFrame(self.tab_2) self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") self.verticalLayout_21 = QtWidgets.QVBoxLayout(self.frame) self.verticalLayout_21.setObjectName("verticalLayout_21") self.verticalLayout_20 = QtWidgets.QVBoxLayout() self.verticalLayout_20.setObjectName("verticalLayout_20") self.horizontalLayout_8 = QtWidgets.QHBoxLayout() self.horizontalLayout_8.setObjectName("horizontalLayout_8") self.tableWidget_7 = QtWidgets.QTableWidget(self.frame) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tableWidget_7.sizePolicy().hasHeightForWidth()) self.tableWidget_7.setSizePolicy(sizePolicy) self.tableWidget_7.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.tableWidget_7.setAlternatingRowColors(True) self.tableWidget_7.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) self.tableWidget_7.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.tableWidget_7.setObjectName("tableWidget_7") self.tableWidget_7.setColumnCount(1) self.tableWidget_7.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.tableWidget_7.setHorizontalHeaderItem(0, item) self.tableWidget_7.horizontalHeader().setStretchLastSection(True) self.horizontalLayout_8.addWidget(self.tableWidget_7) self.verticalLayout_20.addLayout(self.horizontalLayout_8) self.verticalLayout_21.addLayout(self.verticalLayout_20) self.verticalLayout_17.addWidget(self.frame) self.frame_8 = QtWidgets.QFrame(self.tab_2) self.frame_8.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_8.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_8.setObjectName("frame_8") self.horizontalLayout_10 = QtWidgets.QHBoxLayout(self.frame_8) self.horizontalLayout_10.setObjectName("horizontalLayout_10") self.horizontalLayout_7 = QtWidgets.QHBoxLayout() self.horizontalLayout_7.setObjectName("horizontalLayout_7") spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_7.addItem(spacerItem2) spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_7.addItem(spacerItem3) self.label_3 = QtWidgets.QLabel(self.frame_8) self.label_3.setObjectName("label_3") self.horizontalLayout_7.addWidget(self.label_3) spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_7.addItem(spacerItem4) spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_7.addItem(spacerItem5) self.horizontalLayout_10.addLayout(self.horizontalLayout_7) self.verticalLayout_17.addWidget(self.frame_8) self.verticalLayout_17.setStretch(0, 2) self.verticalLayout_17.setStretch(1, 7) self.verticalLayout_17.setStretch(2, 1) self.tabWidget.addTab(self.tab_2, "") self.horizontalLayout_16.addWidget(self.tabWidget) self.line = QtWidgets.QFrame(self.centralwidget) self.line.setFrameShape(QtWidgets.QFrame.VLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.horizontalLayout_16.addWidget(self.line) self.frame_2 = QtWidgets.QFrame(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) self.frame_2.setSizePolicy(sizePolicy) self.frame_2.setMinimumSize(QtCore.QSize(250, 0)) self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_2.setObjectName("frame_2") self.verticalLayout_10 = QtWidgets.QVBoxLayout(self.frame_2) self.verticalLayout_10.setObjectName("verticalLayout_10") self.frame_3 = QtWidgets.QFrame(self.frame_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.frame_3.sizePolicy().hasHeightForWidth()) self.frame_3.setSizePolicy(sizePolicy) self.frame_3.setFrameShape(QtWidgets.QFrame.Box) self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_3.setObjectName("frame_3") self.verticalLayout_9 = QtWidgets.QVBoxLayout(self.frame_3) self.verticalLayout_9.setObjectName("verticalLayout_9") self.horizontalLayout_9 = QtWidgets.QHBoxLayout() self.horizontalLayout_9.setObjectName("horizontalLayout_9") self.label_4 = QtWidgets.QLabel(self.frame_3) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_4.sizePolicy().hasHeightForWidth()) self.label_4.setSizePolicy(sizePolicy) self.label_4.setScaledContents(True) self.label_4.setObjectName("label_4") self.horizontalLayout_9.addWidget(self.label_4) self.verticalLayout_9.addLayout(self.horizontalLayout_9) self.verticalLayout_10.addWidget(self.frame_3) self.frame_5 = QtWidgets.QFrame(self.frame_2) self.frame_5.setFrameShape(QtWidgets.QFrame.Box) self.frame_5.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_5.setObjectName("frame_5") self.horizontalLayout_13 = QtWidgets.QHBoxLayout(self.frame_5) self.horizontalLayout_13.setObjectName("horizontalLayout_13") self.formLayout = QtWidgets.QFormLayout() self.formLayout.setObjectName("formLayout") self.label_5 = QtWidgets.QLabel(self.frame_5) self.label_5.setObjectName("label_5") self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_5) self.label_6 = QtWidgets.QLabel(self.frame_5) self.label_6.setObjectName("label_6") self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.label_6) self.label_7 = QtWidgets.QLabel(self.frame_5) self.label_7.setObjectName("label_7") self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_7) self.label_8 = QtWidgets.QLabel(self.frame_5) self.label_8.setObjectName("label_8") self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.label_8) self.label_9 = QtWidgets.QLabel(self.frame_5) self.label_9.setObjectName("label_9") self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_9) self.label_10 = QtWidgets.QLabel(self.frame_5) self.label_10.setObjectName("label_10") self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.label_10) self.label_11 = QtWidgets.QLabel(self.frame_5) self.label_11.setObjectName("label_11") self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_11) self.label_12 = QtWidgets.QLabel(self.frame_5) self.label_12.setObjectName("label_12") self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.label_12) self.label_21 = QtWidgets.QLabel(self.frame_5) self.label_21.setObjectName("label_21") self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_21) self.label_22 = QtWidgets.QLabel(self.frame_5) self.label_22.setObjectName("label_22") self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.label_22) self.label_23 = QtWidgets.QLabel(self.frame_5) self.label_23.setObjectName("label_23") self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_23) self.label_24 = QtWidgets.QLabel(self.frame_5) self.label_24.setObjectName("label_24") self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.label_24) self.label_26 = QtWidgets.QLabel(self.frame_5) self.label_26.setObjectName("label_26") self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.label_26) self.label_27 = QtWidgets.QLabel(self.frame_5) self.label_27.setObjectName("label_27") self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.label_27) self.horizontalLayout_13.addLayout(self.formLayout) self.verticalLayout_10.addWidget(self.frame_5) self.groupBox_7 = QtWidgets.QGroupBox(self.frame_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.groupBox_7.sizePolicy().hasHeightForWidth()) self.groupBox_7.setSizePolicy(sizePolicy) self.groupBox_7.setObjectName("groupBox_7") self.horizontalLayout_11 = QtWidgets.QHBoxLayout(self.groupBox_7) self.horizontalLayout_11.setObjectName("horizontalLayout_11") self.label_25 = QtWidgets.QLabel(self.groupBox_7) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_25.sizePolicy().hasHeightForWidth()) self.label_25.setSizePolicy(sizePolicy) self.label_25.setScaledContents(True) self.label_25.setWordWrap(True) self.label_25.setObjectName("label_25") self.horizontalLayout_11.addWidget(self.label_25) self.verticalLayout_10.addWidget(self.groupBox_7) self.horizontalLayout_16.addWidget(self.frame_2) self.line_2 = QtWidgets.QFrame(self.centralwidget) self.line_2.setFrameShape(QtWidgets.QFrame.VLine) self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_2.setObjectName("line_2") self.horizontalLayout_16.addWidget(self.line_2) self.frame_4 = QtWidgets.QFrame(self.centralwidget) self.frame_4.setMinimumSize(QtCore.QSize(200, 0)) self.frame_4.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_4.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_4.setObjectName("frame_4") self.verticalLayout_11 = QtWidgets.QVBoxLayout(self.frame_4) self.verticalLayout_11.setObjectName("verticalLayout_11") self.groupBox_8 = QtWidgets.QGroupBox(self.frame_4) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.groupBox_8.sizePolicy().hasHeightForWidth()) self.groupBox_8.setSizePolicy(sizePolicy) self.groupBox_8.setObjectName("groupBox_8") self.horizontalLayout_12 = QtWidgets.QHBoxLayout(self.groupBox_8) self.horizontalLayout_12.setObjectName("horizontalLayout_12") self.play_list = QtWidgets.QTableWidget(self.groupBox_8) self.play_list.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.play_list.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) self.play_list.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.play_list.setObjectName("play_list") self.play_list.setColumnCount(1) self.play_list.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.play_list.setHorizontalHeaderItem(0, item) self.play_list.horizontalHeader().setStretchLastSection(True) self.play_list.verticalHeader().setVisible(True) self.horizontalLayout_12.addWidget(self.play_list, 0, QtCore.Qt.AlignHCenter) self.verticalLayout_11.addWidget(self.groupBox_8) self.horizontalLayout_16.addWidget(self.frame_4) self.verticalLayout_13.addLayout(self.horizontalLayout_16) self.line_3 = QtWidgets.QFrame(self.centralwidget) self.line_3.setFrameShape(QtWidgets.QFrame.HLine) self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_3.setObjectName("line_3") self.verticalLayout_13.addWidget(self.line_3) self.frame_6 = QtWidgets.QFrame(self.centralwidget) self.frame_6.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_6.setFrameShadow(QtWidgets.QFrame.Sunken) self.frame_6.setObjectName("frame_6") self.verticalLayout_14 = QtWidgets.QVBoxLayout(self.frame_6) self.verticalLayout_14.setContentsMargins(10, -1, -1, -1) self.verticalLayout_14.setObjectName("verticalLayout_14") self.horizontalLayout_14 = QtWidgets.QHBoxLayout() self.horizontalLayout_14.setContentsMargins(100, -1, 100, -1) self.horizontalLayout_14.setObjectName("horizontalLayout_14") self.label_play_state = QtWidgets.QLabel(self.frame_6) self.label_play_state.setObjectName("label_play_state") self.horizontalLayout_14.addWidget(self.label_play_state, 0, QtCore.Qt.AlignHCenter) self.pushButton_8 = QtWidgets.QPushButton(self.frame_6) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.pushButton_8.sizePolicy().hasHeightForWidth()) self.pushButton_8.setSizePolicy(sizePolicy) self.pushButton_8.setObjectName("pushButton_8") self.horizontalLayout_14.addWidget(self.pushButton_8) self.verticalLayout_14.addLayout(self.horizontalLayout_14) self.frame_7 = QtWidgets.QFrame(self.frame_6) self.frame_7.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_7.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_7.setObjectName("frame_7") self.verticalLayout_12 = QtWidgets.QVBoxLayout(self.frame_7) self.verticalLayout_12.setContentsMargins(-1, 0, -1, 0) self.verticalLayout_12.setObjectName("verticalLayout_12") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setContentsMargins(100, 10, 100, -1) self.horizontalLayout.setObjectName("horizontalLayout") self.pushButton_2 = QtWidgets.QPushButton(self.frame_7) self.pushButton_2.setObjectName("pushButton_2") self.horizontalLayout.addWidget(self.pushButton_2) self.pushButton_3 = QtWidgets.QPushButton(self.frame_7) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.pushButton_3.sizePolicy().hasHeightForWidth()) self.pushButton_3.setSizePolicy(sizePolicy) self.pushButton_3.setObjectName("pushButton_3") self.horizontalLayout.addWidget(self.pushButton_3) self.pushButton_4 = QtWidgets.QPushButton(self.frame_7) self.pushButton_4.setObjectName("pushButton_4") self.horizontalLayout.addWidget(self.pushButton_4) self.pushButton_5 = QtWidgets.QPushButton(self.frame_7) self.pushButton_5.setObjectName("pushButton_5") self.horizontalLayout.addWidget(self.pushButton_5) self.pushButton_6 = QtWidgets.QPushButton(self.frame_7) self.pushButton_6.setObjectName("pushButton_6") self.horizontalLayout.addWidget(self.pushButton_6) self.pushButton_7 = QtWidgets.QPushButton(self.frame_7) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.pushButton_7.sizePolicy().hasHeightForWidth()) self.pushButton_7.setSizePolicy(sizePolicy) self.pushButton_7.setObjectName("pushButton_7") self.horizontalLayout.addWidget(self.pushButton_7) self.volume_slider = QtWidgets.QSlider(self.frame_7) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.volume_slider.sizePolicy().hasHeightForWidth()) self.volume_slider.setSizePolicy(sizePolicy) self.volume_slider.setMaximum(100) self.volume_slider.setOrientation(QtCore.Qt.Horizontal) self.volume_slider.setObjectName("volume_slider") self.horizontalLayout.addWidget(self.volume_slider) self.verticalLayout_12.addLayout(self.horizontalLayout) self.horizontalLayout_15 = QtWidgets.QHBoxLayout() self.horizontalLayout_15.setContentsMargins(200, 10, 200, -1) self.horizontalLayout_15.setObjectName("horizontalLayout_15") self.progress_slider = QtWidgets.QSlider(self.frame_7) self.progress_slider.setOrientation(QtCore.Qt.Horizontal) self.progress_slider.setObjectName("progress_slider") self.horizontalLayout_15.addWidget(self.progress_slider) self.label_play_time = QtWidgets.QLabel(self.frame_7) self.label_play_time.setObjectName("label_play_time") self.horizontalLayout_15.addWidget(self.label_play_time) self.verticalLayout_12.addLayout(self.horizontalLayout_15) self.verticalLayout_14.addWidget(self.frame_7) self.verticalLayout_13.addWidget(self.frame_6) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1496, 26)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "小说听听听")) self.groupBox.setTitle(_translate("MainWindow", "听China")) item = self.tableWidget_1.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "书名")) self.groupBox_2.setTitle(_translate("MainWindow", "有声小说")) item = self.tableWidget_2.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "书名")) self.groupBox_3.setTitle(_translate("MainWindow", "听书宝")) item = self.tableWidget_3.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "书名")) self.groupBox_4.setTitle(_translate("MainWindow", "I275")) item = self.tableWidget_4.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "书名")) self.groupBox_5.setTitle(_translate("MainWindow", "听书cn")) item = self.tableWidget_5.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "书名")) self.groupBox_6.setTitle(_translate("MainWindow", "芒果听")) item = self.tableWidget_6.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "书名")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "小说推荐")) self.label.setText(_translate("MainWindow", "关键字:")) self.pushButton.setText(_translate("MainWindow", "搜索")) self.label_2.setText(_translate("MainWindow", "音源:")) self.comboBox.setItemText(0, _translate("MainWindow", "-请选择-")) self.comboBox.setItemText(1, _translate("MainWindow", "听China")) self.comboBox.setItemText(2, _translate("MainWindow", "有声小说")) self.comboBox.setItemText(3, _translate("MainWindow", "听书宝")) self.comboBox.setItemText(4, _translate("MainWindow", "I275")) self.comboBox.setItemText(5, _translate("MainWindow", "听书cn")) self.comboBox.setItemText(6, _translate("MainWindow", "芒果听")) item = self.tableWidget_7.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "书名")) self.label_3.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\"><span style=\" color:#55aaff;\">请先搜索</span></p></body></html>")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "小说搜索")) self.label_4.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">这里显示小说封面</p></body></html>")) self.label_5.setText(_translate("MainWindow", "名称:")) self.label_6.setText(_translate("MainWindow", "未知")) self.label_7.setText(_translate("MainWindow", "状态:")) self.label_8.setText(_translate("MainWindow", "未知")) self.label_9.setText(_translate("MainWindow", "作者:")) self.label_10.setText(_translate("MainWindow", "未知")) self.label_11.setText(_translate("MainWindow", "主播:")) self.label_12.setText(_translate("MainWindow", "未知")) self.label_21.setText(_translate("MainWindow", "类型:")) self.label_22.setText(_translate("MainWindow", "未知")) self.label_23.setText(_translate("MainWindow", "更新时间:")) self.label_24.setText(_translate("MainWindow", "未知")) self.label_26.setText(_translate("MainWindow", "剧集数量")) self.label_27.setText(_translate("MainWindow", "未知")) self.groupBox_7.setTitle(_translate("MainWindow", "介绍")) self.label_25.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">未知</p></body></html>")) self.groupBox_8.setTitle(_translate("MainWindow", "点播列表")) item = self.play_list.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "剧集")) self.label_play_state.setText(_translate("MainWindow", "<html><head/><body><p><span style=\" color:#55aaff;\">播放器已就绪</span></p></body></html>")) self.pushButton_8.setText(_translate("MainWindow", "收起")) self.pushButton_2.setText(_translate("MainWindow", "播放")) self.pushButton_3.setText(_translate("MainWindow", "暂停")) self.pushButton_4.setText(_translate("MainWindow", "停止")) self.pushButton_5.setText(_translate("MainWindow", "上一集")) self.pushButton_6.setText(_translate("MainWindow", "下一集")) self.pushButton_7.setText(_translate("MainWindow", "静音")) self.label_play_time.setText(_translate("MainWindow", "<html><head/><body><p><span style=\" color:#55aaff;\">0:00/0:00</span></p></body></html>"))

五.总结

本次使用PyQt5制作了一款在线小说播放器,支持六个音源的搜索,音频内容均来自互联网,UI没有详细地取设计,使用的默认的Fusion作为整体的主题皮肤,在播放器中使用第三方库qtawesome小图标,可视效果更强。写本文是为了记录一下开发思路与设计流程。思路、代码方面有什么不足欢迎各位大佬指正、批评!觉得还行,能点个赞吗?

相关推荐

相关文章