摘要
本軟件為使用python語(yǔ)言編寫(xiě)的工具箱,界面使用PyQt5庫(kù)疾渴,實(shí)現(xiàn)了可視化界面睬捶。使用PyQt5庫(kù)中的日歷繪制了日歷功能。使用PyQt5庫(kù)以及pillow庫(kù)實(shí)現(xiàn)圖片轉(zhuǎn)“10”字符畫(huà)榔组。使用PyQt5實(shí)現(xiàn)了計(jì)算器。使用PyQt5以及you_get庫(kù)實(shí)現(xiàn)了視頻下載功能联逻,使用subprocess和ffmpeg實(shí)現(xiàn)了FLV格式視頻轉(zhuǎn)MP4格式搓扯。使用PyQt5庫(kù)實(shí)現(xiàn)音樂(lè)播放器。編寫(xiě)爬蟲(chóng)腳本實(shí)現(xiàn)翻譯包归,PyQt5庫(kù)對(duì)翻譯記錄的存儲(chǔ)與讀取锨推。
1.引言
背景:python在發(fā)展了這么久的形勢(shì)下,其所包含的方法公壤,庫(kù)包以及第三方庫(kù)包數(shù)量龐大爱态。Python在很多場(chǎng)合都可以用到,由于提供了這些庫(kù)包境钟,所以在實(shí)現(xiàn)功能時(shí)可以使用這些python的庫(kù)包。工具類(lèi)的軟件在網(wǎng)上比較難找到俭识,想在基于這些庫(kù)包下做一個(gè)滿足自己需求的軟件慨削,對(duì)自己有一定作用的幫助,在日后也可以使用到套媚。
意義: 所做的軟件為工具類(lèi)缚态,在多種場(chǎng)合可以使用,盡管還不夠完善堤瘤,但也滿足了目前基本需求玫芦,軟件可持續(xù)性良好,日后有更多需求可以在此基礎(chǔ)上進(jìn)行更多的擴(kuò)展本辐。
論文要實(shí)現(xiàn)的功能:日歷功能桥帆,字符畫(huà)轉(zhuǎn)換,計(jì)算器慎皱,視頻下載/轉(zhuǎn)換老虫,音樂(lè)播放器,翻譯茫多。
2. 系統(tǒng)結(jié)構(gòu)
2.1系統(tǒng)結(jié)構(gòu)框架
2.2系統(tǒng)所使用的技術(shù)祈匙、模塊
PyQt5:pyqt5是一套Python綁定Digia QT5應(yīng)用的框架。它可用于Python 2和3。Qt庫(kù)是最強(qiáng)大的GUI庫(kù)之一夺欲。pyqt5做為Python的一個(gè)模塊跪帝,它有620多個(gè)類(lèi)和6000個(gè)函數(shù)和方法。這是一個(gè)跨平臺(tái)的工具包些阅,它可以運(yùn)行在所有主要的操作系統(tǒng)伞剑,包括UNIX,Windows扑眉,Mac OS纸泄。pyqt5是雙重許可。開(kāi)發(fā)者可以在GPL和商業(yè)許可之間進(jìn)行選擇腰素。
you_get: you-get是一個(gè)基于python3的下載器聘裁,沒(méi)有客戶端或者可視化工具,它是在cmd中通過(guò)命令行運(yùn)行的弓千。
Ffmpeg:FFmpeg是一套可以用來(lái)記錄衡便、轉(zhuǎn)換數(shù)字音頻、視頻洋访,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序镣陕。采用LGPL或GPL許可證。其使用方法與you_get類(lèi)似姻政,采用命令行運(yùn)行呆抑。
Sys: 該模塊提供對(duì)解釋器使用或維護(hù)的一些變量的訪問(wèn),以及與解釋器強(qiáng)烈交互的函數(shù)汁展。
Os: 模塊提供了非常豐富的方法用來(lái)處理文件和目錄鹊碍。
Urllib:urllib提供了一系列用于操作URL的功能。
2.3功能對(duì)應(yīng)的模塊
日歷功能:PyQt5食绿。
字符畫(huà)轉(zhuǎn)換功能:PyQt5侈咕,pillow。
計(jì)算器功能:PyQt5器紧。
視頻下載/轉(zhuǎn)換功能:PyQt5耀销,sys,os铲汪。
音樂(lè)播放器功能:PyQt5熊尉。
翻譯功能:PyQt5,urllib桥状,os帽揪。
3. 實(shí)現(xiàn)代碼
3.1導(dǎo)入庫(kù)包
導(dǎo)入PyQt5所需庫(kù)包,os辅斟,sys转晰,subprocess,json,PIL查邢。
import subprocess
import os
import time
import json
import ffmpy
import sys#導(dǎo)入系統(tǒng)
from urllib import request,parse
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtMultimedia import *
from PIL import Image
import argparse
3.2主界面
3.2.1主界面繪制
使用PyQt5進(jìn)行主界面的繪制蔗崎。
class FirstUi(QMainWindow):#第一個(gè)窗口類(lèi)
def __init__(self):
super(FirstUi, self).__init__()
self.init_ui()
def init_ui(self):
self.resize(580, 300)#設(shè)置窗口大小
self.setWindowTitle('LSY的工具箱')#設(shè)置窗口標(biāo)題
self.btn1 = QPushButton('日歷', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn1.setGeometry(30, 50, 150, 50)#前面是按鈕左上角坐標(biāo),后面是窗口大小
self.btn1.clicked.connect(self.slot_Calendarbtn_function)#將信號(hào)連接到槽
self.btn1.setIcon(QIcon("日歷.ico"))
self.setWindowIcon(QIcon('main-icon.ico'))
self.btn2 = QPushButton('字符畫(huà)轉(zhuǎn)換', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn2.setGeometry(200, 50, 150, 50)#前面是按鈕左上角坐標(biāo)扰藕,后面是窗口大小
self.btn2.clicked.connect(self.slot_DrowByteUibtn_function)#將信號(hào)連接到槽
self.btn2.setIcon(QIcon("轉(zhuǎn)換圖形.ico"))
self.btn3 = QPushButton('計(jì)算器', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn3.setGeometry(380, 50, 150, 50)#前面是按鈕左上角坐標(biāo)缓苛,后面是窗口大小
self.btn3.clicked.connect(self.slot_CalculatorUibtn_function)#將信號(hào)連接到槽
self.btn3.setIcon(QIcon("計(jì)算器.ico"))
self.btn4 = QPushButton('視頻下載/轉(zhuǎn)換', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn4.setGeometry(30, 150, 150, 50)#前面是按鈕左上角坐標(biāo),后面是窗口大小
self.btn4.clicked.connect(self.slot_DownloadUibtn_function)#將信號(hào)連接到槽
self.btn4.setIcon(QIcon("視頻.ico"))
self.btn5 = QPushButton('音樂(lè)播放器', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn5.setGeometry(200, 150, 150, 50)#前面是按鈕左上角坐標(biāo)邓深,后面是窗口大小
self.btn5.clicked.connect(self.slot_MusicUibtn_function)#將信號(hào)連接到槽
self.btn5.setIcon(QIcon("音樂(lè).ico"))
self.btn6 = QPushButton('翻譯', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn6.setGeometry(380, 150, 150, 50)#前面是按鈕左上角坐標(biāo)未桥,后面是窗口大小
self.btn6.clicked.connect(self.slot_TranslationUibtn_function)#將信號(hào)連接到槽
self.btn6.setIcon(QIcon("翻譯.ico"))
3.2.2將主界面按鈕進(jìn)行事件綁定
對(duì)按鈕進(jìn)行事件的綁定,將主界面隱藏芥备,子界面顯示冬耿。
#跳轉(zhuǎn)日歷界面I
def slot_Calendarbtn_function(self):
self.hide()#隱藏此窗口
self.s = CalendarUi()#將第二個(gè)窗口換個(gè)名字
self.s.show()#經(jīng)第二個(gè)窗口顯示出來(lái)
#字符畫(huà)轉(zhuǎn)換界面
def slot_DrowByteUibtn_function(self):
self.hide()#隱藏此窗口
self.s = DrowByteUi()#將第二個(gè)窗口換個(gè)名字
self.s.show()#經(jīng)第二個(gè)窗口顯示出來(lái)
#字符畫(huà)轉(zhuǎn)換界面
def slot_DownloadUibtn_function(self):
self.hide()#隱藏此窗口
self.s = DownloadUi()#將第二個(gè)窗口換個(gè)名字
self.s.show()#經(jīng)第二個(gè)窗口顯示出來(lái)
#計(jì)算器界面
def slot_CalculatorUibtn_function(self):
self.hide()#隱藏此窗口
self.s = CalculatorUi()#將第二個(gè)窗口換個(gè)名字
self.s.show()#經(jīng)第二個(gè)窗口顯示出來(lái)
#音樂(lè)播放器界面
def slot_MusicUibtn_function(self):
self.hide()#隱藏此窗口
self.s = MusicUi()#將第二個(gè)窗口換個(gè)名字
self.s.show()#經(jīng)第二個(gè)窗口顯示出來(lái)
#翻譯界面
def slot_TranslationUibtn_function(self):
self.hide()#隱藏此窗口
self.s = TranslationUi()#將第二個(gè)窗口換個(gè)名字
self.s.show()#經(jīng)第二個(gè)窗口顯示出來(lái)
3.3日歷功能
3.3.1日歷界面編寫(xiě)
使用PyQt5進(jìn)行日歷界面編寫(xiě)。
#日歷功能
class CalendarUi(QWidget):#建立第二個(gè)窗口的類(lèi)
def __init__(self):
super(CalendarUi, self).__init__()
self.init_ui()
def init_ui(self):
self.resize(500, 350)#設(shè)置第二個(gè)窗口代碼
self.setWindowTitle('日歷')#設(shè)置第二個(gè)窗口標(biāo)題
self.btn = QPushButton('返回', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn.setGeometry(350, 200, 100, 50)#前面是按鈕左上角坐標(biāo)萌壳,后面是按鈕大小
self.btn.clicked.connect(self.slot_btn_function)#將信號(hào)連接到槽
self.setWindowIcon(QIcon('日歷.ico'))
cal = QCalendarWidget(self)
cal.setGridVisible(True)
cal.move(20, 20)
cal.clicked[QDate].connect(self.showDate)
self.lbl = QLabel(self)
date = cal.selectedDate()
self.lbl.setText(date.toString())
self.lbl.move(130, 260)
self.setGeometry(300, 300, 500, 300)
self.show()
3.3.2日歷方法
def slot_btn_function(self):
self.hide()#隱藏此窗口
self.f = FirstUi()#將第一個(gè)窗口換個(gè)名字
self.f.show()#將第一個(gè)窗口顯示出來(lái)
def showDate(self, date):
self.lbl.setText(date.toString())
def closeEvent(self, event):
"""
重寫(xiě)closeEvent方法亦镶,實(shí)現(xiàn)dialog窗體關(guān)閉時(shí)執(zhí)行一些代碼
:param event: close()觸發(fā)的事件
:return: None
"""
reply = QMessageBox.question(self,
'本工具',
"是否要退出程序?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
3.4字符畫(huà)轉(zhuǎn)換
3.4.1字符畫(huà)轉(zhuǎn)換界面
#字符畫(huà)轉(zhuǎn)換
class DrowByteUi(QWidget):#建立第三個(gè)窗口的類(lèi)
def __init__(self):
super(DrowByteUi, self).__init__()
self.init_ui()
self.cur_path=''
self.img_path=''
self.WIDTH=300
self.HEIGHT=100
self.ascii_char = list("10")
def init_ui(self):
font = QFont()
font.setFamily("Arial") #括號(hào)里可以設(shè)置成自己想要的其它字體
font.setPointSize(1)
self.setWindowIcon(QIcon('轉(zhuǎn)換圖形.ico'))
self.resize(500, 350)#設(shè)置第三個(gè)窗口代碼
self.setWindowTitle('字符轉(zhuǎn)換')#設(shè)置第三個(gè)窗口標(biāo)題
self.btn = QPushButton('返回', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn.setGeometry(350, 30, 100, 50)#前面是按鈕左上角坐標(biāo)袱瓮,后面是按鈕大小
self.btn.clicked.connect(self.slot_btn_function)#將信號(hào)連接到槽
self.btnUp = QPushButton('選擇圖片', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btnUp.setGeometry(50, 30, 80, 50)#前面是按鈕左上角坐標(biāo)缤骨,后面是按鈕大小
self.btnUp.clicked.connect(self.openDir)#將信號(hào)連接到槽
self.btnUp.setStyle(QStyleFactory.create('Fusion'))
self.btnChange = QPushButton('開(kāi)始轉(zhuǎn)換', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btnChange.setGeometry(200, 30, 80, 50)#前面是按鈕左上角坐標(biāo),后面是按鈕大小
self.btnChange.clicked.connect(self.changeImg)#將信號(hào)連接到槽
self.btnChange.setStyle(QStyleFactory.create('Fusion'))
self.text1 = QTextEdit(self)
self.text1.setFocusPolicy(Qt.NoFocus)
self.text1.setGeometry(10,150,0,0)
self.text1.setFont(font)
self.lbl = QLabel(self)
self.lbl.setGeometry(300, 200,300,300)
3.4.2字符畫(huà)轉(zhuǎn)換函數(shù)
編寫(xiě)選取圖片尺借,轉(zhuǎn)換圖片绊起,計(jì)算灰度函數(shù)。
def openDir(self):
#self.reset()
self.cur_path = QFileDialog.getOpenFileName(self, "選取圖片", '',"*.jpg;;*.png;;All Files(*)")
#print(self.cur_path[0])
self.img_path=self.cur_path[0]
img = Image.open(self.img_path)
print(img.size[1])
image = QImage(self.img_path)
size = QSize(int(img.size[0]*0.6), int(img.size[1]*0.6))
pixImg = QPixmap.fromImage(image.scaled(size, Qt.IgnoreAspectRatio))
self.lbl.setGeometry(50, 100,img.size[0],img.size[1])
self.resize(500+img.size[0]*0.6, 350+img.size[1]*0.6)#設(shè)置第三個(gè)窗口代碼
self.text1.setGeometry(img.size[0]*0.6+60,100,img.size[0]*0.6,img.size[1]*0.6)
self.lbl.resize(img.size[0]*0.6, img.size[1]*0.6)
self.lbl.setPixmap(pixImg)
def changeImg(self):
im=Image.open(self.img_path)
im=im.resize((self.WIDTH,self.HEIGHT),Image.NEAREST)
txt=""
for i in range(self.HEIGHT):
for j in range(self.WIDTH):
txt+=self.get_char(*im.getpixel((j,i)))
txt+='\n'
print (txt)
self.text1.setText(txt)
#寫(xiě)入文件
with open("output.txt",'w') as f:
f.write(txt)
#將256灰度映射到70個(gè)字符上
def get_char(self,r,g,b,alpha=256):#alpha透明度
if alpha==0:
return ' '
length=len(self.ascii_char)
gray=int(0.299 *r+0.587*g+0.114*b)#計(jì)算灰度
unit=(256.0+1)/length
return self.ascii_char[int(gray/unit)]#不同的灰度對(duì)應(yīng)著不同的字符
def slot_btn_function(self):
self.hide()#隱藏此窗口
self.f = FirstUi()#將第一個(gè)窗口換個(gè)名字
self.f.show()#將第一個(gè)窗口顯示出來(lái)
def closeEvent(self, event):
"""
重寫(xiě)closeEvent方法燎斩,實(shí)現(xiàn)dialog窗體關(guān)閉時(shí)執(zhí)行一些代碼
:param event: close()觸發(fā)的事件
:return: None
"""
reply = QMessageBox.question(self,
'本工具',
"是否要退出程序勒庄?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
3.5計(jì)算器功能
3.5.1繪制計(jì)算器主界面
#計(jì)算器
class CalculatorUi(QWidget):#建立第四個(gè)窗口的類(lèi)
def __init__(self):
super(CalculatorUi, self).__init__()
self.init_ui()
self.reset()
def init_ui(self):
font = QFont()
font.setFamily("微軟雅黑") #括號(hào)里可以設(shè)置成自己想要的其它字體
font.setPointSize(16)
self.resize(600, 650)#設(shè)置第四個(gè)窗口代碼
self.setWindowTitle('計(jì)算器')#設(shè)置第四個(gè)窗口標(biāo)題
#self.btn = QPushButton('返回', self)#設(shè)置按鈕和按鈕名稱(chēng)
#self.btn.setGeometry(150, 150, 100, 50)#前面是按鈕左上角坐標(biāo),后面是按鈕大小
#self.btn.clicked.connect(self.slot_btn_function)#將信號(hào)連接到槽
self.setWindowIcon(QIcon('計(jì)算器.ico'))
# 設(shè)置文本
self.lineEdit = QLineEdit("0")
# 文本從右面開(kāi)始顯示
self.lineEdit.setAlignment(Qt.AlignRight)
# 禁止直接輸入 只讀
self.lineEdit.setReadOnly(True)
# 設(shè)置顯示文本得到字體
self.lineEdit.setFont(QFont("Times", 20))
# 設(shè)置最多顯示的數(shù)字長(zhǎng)度
self.lineEdit.setMaxLength(15)
grid = QGridLayout()
self.setLayout(grid)
names = [
"AC", "Del", "back", "close",
"7", "8", "9", "+",
"4", "5", "6", "-",
"1", "2", "3", "*",
"0", ".", "=", "/"
]
positions = [(i,j) for i in range(1,6) for j in range(0,4)]
grid.addWidget(self.lineEdit, 0, 0, 1, 4)
for position, name in zip(positions, names):
btn = QPushButton(name)
btn.resize(btn.sizeHint())
btn.setFont(font)
btn.setFixedSize(90, 60)
btn.clicked.connect(self.buttonClick)
if name == '':
continue
grid.addWidget(btn, *position)
#self.move(300, 150)
self.setLayout(grid)
self.show()
3.5.2計(jì)算器方法
3.5.2.1按鈕方法綁定
def buttonClick(self):
# 獲取number
text = self.sender().text()
print(text)
if text in "+-*/":
self.string += text
# 用來(lái)存儲(chǔ)表達(dá)式
self.number = ""
# 在這里如果繼續(xù)執(zhí)行的話在界面展示會(huì)有問(wèn)題所以退出
self.last = text
return
# 用eval的話不需要判斷點(diǎn)
# elif text == ".":
elif text == "=":
self.resault()
return
elif text == "AC":
self.reset()
elif text == "Del":
self.deleat()
elif text == "close":
self.close()
elif text == "back":
self.slot_btn_function()
else:
# 如果之前已經(jīng)按了等號(hào)在按數(shù)字的話清空之前的值
if self.last == "=" and type(eval(text)) == int:
self.reset()
# 除零判斷
elif self.last == "/" and text == "0":
self.number = "error"
self.lineEdit.setText(self.number)
return
# 如果 self.number 瘫里!= 0 self.number = self.number + text 否則 self.number = text
if self.number != "0":
self.number = self.number + text
else:
self.number = text
#self.number = self.number + text if self.number != "0" else text
self.string += text
# 用來(lái)記錄按鍵
self.lineEdit.setText(self.number)
def slot_btn_function(self):
self.hide()#隱藏此窗口
self.f = FirstUi()#將第一個(gè)窗口換個(gè)名字
self.f.show()#將第一個(gè)窗口顯示出來(lái)
3.5.2.2結(jié)果設(shè)置方法
def resault(self):
self.lineEdit.setText(str(eval(self.string)))
# 這一個(gè)設(shè)置每次運(yùn)算完后直接將結(jié)果改變
self.string = str(eval(self.string))
self.number = ""
self.last = "="
3.5.2.3重置方法
def reset(self):
#重置用來(lái)接收按鈕數(shù)字
self.number = "0"
# 重置用來(lái)存儲(chǔ)按鈕數(shù)字和運(yùn)算符的字符串
self.string = ""
self.last = ""
self.symbol = ""
3.5.2.4刪除方法
def deleat(self):
self.string = self.string[0:-1]
# self.number = self.number[0:-1]
# # 如果self.number 的刪除后為空則設(shè)置為0
# if not self.number:
# self.number = "0"
# 間寫(xiě)
self.number = self.number[0: -1] if self.number[0: -1] else "0"
3.5.2.5關(guān)閉事件
def closeEvent(self, event):
"""
重寫(xiě)closeEvent方法,實(shí)現(xiàn)dialog窗體關(guān)閉時(shí)執(zhí)行一些代碼
:param event: close()觸發(fā)的事件
:return: None
"""
reply = QMessageBox.question(self,
'本工具',
"是否要退出程序荡碾?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
3.6視頻下載/轉(zhuǎn)換功能
3.6.1視頻下載/轉(zhuǎn)換界面繪制
#下載工具
class DownloadUi(QWidget):#建立第五個(gè)窗口的類(lèi)
def __init__(self):
super(DownloadUi, self).__init__()
self.init_ui()
self.url=''
self.FilePath=''
self.dirPath=os.getcwd()
self.reset()
self.oldPath=''
self.oldFilePath=''
def init_ui(self):
self.resize(500, 500)#設(shè)置第五個(gè)窗口代碼
font = QFont()
font.setFamily("微軟雅黑") #括號(hào)里可以設(shè)置成自己想要的其它字體
font.setPointSize(16)
self.setWindowIcon(QIcon('視頻.ico'))
self.setWindowFlags(Qt.WindowMinimizeButtonHint)#禁止最大化
self.setWindowTitle('視頻下載/轉(zhuǎn)換工具')#設(shè)置第五個(gè)窗口標(biāo)題
self.btn1 = QPushButton('返回', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn1.setGeometry(50, 200, 100, 50)#前面是按鈕左上角坐標(biāo)谨读,后面是按鈕大小
self.btn1.clicked.connect(self.slot_btn_function)#將信號(hào)連接到槽
self.btn2 = QPushButton('下載', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn2.setGeometry(350, 200, 100, 50)#前面是按鈕左上角坐標(biāo),后面是按鈕大小
self.btn2.clicked.connect(self.Download1)#將信號(hào)連接到槽
self.le1 = QLineEdit(self)
self.le1.setGeometry(130, 100,300,50)
self.le1.textChanged.connect(self.getCon)
self.lbl1 = QLabel("視頻下載/轉(zhuǎn)換工具", self)
self.lbl1.setFont(font)
self.lbl1.setGeometry(150, 20, 300, 50)
self.lbl2 = QLabel("視頻鏈接:", self)
self.lbl2.setFont(font)
self.lbl2.setGeometry(10, 100, 120, 50)
self.lbl3 = QLabel("", self)
#self.lbl3.setFont(font)
self.lbl3.setGeometry(10, 150, 400, 50)
self.btn3 = QPushButton('', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn3.setGeometry(435, 100, 50, 50)#前面是按鈕左上角坐標(biāo)坛吁,后面是按鈕大小
self.btn3.setIcon(QIcon("文件夾.ico"))
self.btn3.clicked.connect(self.OpenDir)#將信號(hào)連接到槽
self.lbl4 = QLabel("FLV=>MP4轉(zhuǎn)換", self)
self.lbl4.setFont(font)
self.lbl4.setGeometry(150, 260, 300, 50)
self.lbl5 = QLabel("未選擇文件", self)
#self.lbl5.setFont(font)
self.lbl5.setGeometry(10, 330, 360, 50)
self.btn3 = QPushButton('', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn3.setGeometry(435, 330, 50, 50)#前面是按鈕左上角坐標(biāo)劳殖,后面是按鈕大小
self.btn3.setIcon(QIcon("文件夾.ico"))
self.btn3.clicked.connect(self.OpenFile)#將信號(hào)連接到槽
self.btn4 = QPushButton('開(kāi)始轉(zhuǎn)換', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn4.setGeometry(200, 380, 100, 50)#前面是按鈕左上角坐標(biāo),后面是按鈕大小
self.btn4.clicked.connect(self.change)#將信號(hào)連接到槽
3.6.2視頻下載/轉(zhuǎn)換方法
3.6.2.1窗口返回方法
返回主界面拨脉。
def slot_btn_function(self):
self.hide()#隱藏此窗口
self.f = FirstUi()#將第一個(gè)窗口換個(gè)名字
self.f.show()#將第一個(gè)窗口顯示出來(lái)
3.6.2.2重置變量方法
進(jìn)入本界面重置變量哆姻。
def reset(self):
self.lbl3.setText('下載到:'+self.dirPath)
3.6.2.3下載函數(shù)
將獲得的視頻鏈接使用you_get進(jìn)行下載。
def Download1(self):
print(1111)
if self.url== '':
return
head = self.url.split("/")
print(head)
print('Download...')
self.messageDialog()
p = subprocess.call('you-get -o '+self.dirPath+' '+self.url)
if p==0:
msg_box = QMessageBox(QMessageBox.Warning, '下載狀態(tài)', '下載成功!')
msg_box.exec_()
3.6.2.4轉(zhuǎn)換函數(shù)
調(diào)用ffmpeg.exe進(jìn)行視頻轉(zhuǎn)換玫膀。
def change(self):
if self.FilePath== '':
return
name = 'Change'+self.FilePath.split('/')[-1]
name = name.split('.')[0]+'.mp4'
print(name)
ffmpeg_Path = os.path.join(os.getcwd(),'ffmpeg.exe')
print(ffmpeg_Path)
print('Changing...')
self.messageDialog()
p = subprocess.call(ffmpeg_Path+' -i '+self.FilePath+' -strict -2 -vcodec h264 '+name)
if p==0:
msg_box = QMessageBox(QMessageBox.Warning, '轉(zhuǎn)換狀態(tài)', '轉(zhuǎn)換成功!')
msg_box.exec_()
3.6.2.5選擇下載文件夾
調(diào)用本方法改變下載地址矛缨。
def OpenDir(self):
self.reset()
self.oldPath=self.dirPath
self.dirPath = QFileDialog.getExistingDirectory(self, "選取文件夾", self.dirPath)
#print(self.cur_path)
if self.dirPath=='':
self.dirPath=self.oldPath
print(self.dirPath)
self.lbl3.setText('下載到:'+self.dirPath)
3.6.2.6打開(kāi)文件
調(diào)用本函數(shù)打開(kāi)要轉(zhuǎn)換的文件。可通過(guò)在".FLV;;All Files()"添加想要選取的文件類(lèi)型進(jìn)行修改箕昭。
def OpenFile(self):
self.oldFilePath=self.FilePath
self.FilePath=QFileDialog.getOpenFileName(self, "選取要轉(zhuǎn)換的文件", '',"*.FLV;;All Files(*)")
#print(self.FilePath[0])
self.FilePath = self.FilePath[0]
if self.FilePath =='':
self.FilePath=self.oldFilePath
self.lbl5.setText('未選擇文件')
return
print(self.FilePath)
self.lbl5.setText('所選文件:'+self.FilePath.split('/')[-1])
3.6.2.7其他方法
獲取視頻鏈接灵妨、提示窗口。
def getCon(self):
self.url=self.sender().text()
def messageDialog(self):
msg_box = QMessageBox(QMessageBox.Warning, '警告', '下載/轉(zhuǎn)換中都會(huì)出現(xiàn)卡頓現(xiàn)象落竹,請(qǐng)勿進(jìn)行操作!')
msg_box.exec_()
def closeEvent(self, event):
"""
重寫(xiě)closeEvent方法泌霍,實(shí)現(xiàn)dialog窗體關(guān)閉時(shí)執(zhí)行一些代碼
:param event: close()觸發(fā)的事件
:return: None
"""
reply = QMessageBox.question(self,
'本工具',
"是否要退出程序?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
3.7音樂(lè)播放器功能
3.7.1音樂(lè)播放器界面
音樂(lè)播放器界面編寫(xiě)述召。
#音樂(lè)播放器
class MusicUi(QWidget):#建立第三個(gè)窗口的類(lèi)
def __init__(self):
super(MusicUi, self).__init__()
self.init_ui()
self.reset()
def init_ui(self):
self.resize(500, 350)#設(shè)置第三個(gè)窗口代碼
self.setWindowFlags(Qt.WindowMinimizeButtonHint)#禁止最大化
self.setWindowTitle('音樂(lè)播放器')#設(shè)置第三個(gè)窗口標(biāo)題
self.btn = QPushButton('返回', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn.setGeometry(200, 260, 80, 50)#前面是按鈕左上角坐標(biāo)朱转,后面是按鈕大小
self.btn.clicked.connect(self.slot_btn_function)#將信號(hào)連接到槽
self.setWindowIcon(QIcon('音樂(lè).ico'))
self.played = QMediaPlayer()
self.played.setVolume(50.0)
self.label2=QLabel(self)
self.label2.setText("暫未播放音樂(lè)")
self.label2.setAlignment(Qt.AlignCenter)
self.label2.setGeometry(100, 200, 300, 50)
self.btnUp = QPushButton('打開(kāi)文件夾', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btnUp.setGeometry(200, 30, 80, 50)#前面是按鈕左上角坐標(biāo),后面是按鈕大小
self.btnUp.clicked.connect(self.openDir)#將信號(hào)連接到槽
self.btnUp.setStyle(QStyleFactory.create('Fusion'))
# --滑動(dòng)條
self.slider = QSlider(Qt.Horizontal, self)
self.slider.sliderMoved[int].connect(lambda: self.played.setPosition(self.slider.value()))
self.slider.setStyle(QStyleFactory.create('Fusion'))
self.slider.setGeometry(100,150,300,50)
# --計(jì)時(shí)器
self.timer = QTimer(self)
self.timer.start(1000)
self.timer.timeout.connect(self.playByMode)
self.btnUp = QPushButton('上一首', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btnUp.setGeometry(100, 100, 80, 50)#前面是按鈕左上角坐標(biāo)积暖,后面是按鈕大小
self.btnUp.clicked.connect(self.previewMusic)#將信號(hào)連接到槽
self.btnUp.setStyle(QStyleFactory.create('Fusion'))
self.btnCon = QPushButton('播放', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btnCon.setGeometry(200, 100, 80, 50)#前面是按鈕左上角坐標(biāo)藤为,后面是按鈕大小
self.btnCon.clicked.connect(self.playMusic)#將信號(hào)連接到槽
self.btnCon.setStyle(QStyleFactory.create('Fusion'))
self.btnDown = QPushButton('下一首', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btnDown.setGeometry(300, 100, 80, 50)#前面是按鈕左上角坐標(biāo)兔辅,后面是按鈕大小
self.btnDown.clicked.connect(self.nextMusic)#將信號(hào)連接到槽
self.btnDown.setStyle(QStyleFactory.create('Fusion'))
3.7.2音樂(lè)播放器方法
3.7.2.1返回按鈕方法
def slot_btn_function(self):
self.played.pause()
self.hide()#隱藏此窗口
self.f = FirstUi()#將第一個(gè)窗口換個(gè)名字
self.f.show()#將第一個(gè)窗口顯示出來(lái)
3.7.2.2重置方法
def reset(self):
self.cur_path=''
self.songs_list=[]
self.index=0
self.is_pause=True
3.7.2.3打開(kāi)文件夾方法
def openDir(self):
self.reset()
self.cur_path = QFileDialog.getExistingDirectory(self, "選取文件夾", self.cur_path)
#print(self.cur_path)
g = os.walk(self.cur_path)
for path, d, files in g:
for filename in files:
file = os.path.join(path, filename)
if 'mp3' in file:
self.songs_list.append(file)
if self.cur_path:
self.cur_playing_song = ''
self.is_pause = True
self.btnCon.setText('播放')
print(self.songs_list)
3.7.2.4播放音樂(lè)方法
def playMusic(self):
if len(self.songs_list) == 0:
print(11111111111)
self.Tips('當(dāng)前路徑內(nèi)無(wú)可播放的音樂(lè)文件')
return
if not self.played.isAudioAvailable():
self.setCurPlaying()
if self.is_pause:
self.played.play()
self.label2.setText("當(dāng)前播放:"+self.songs_list[self.index].split("\\")[-1])
self.is_pause = False
self.btnCon.setText('暫停')
#print(self.played())
elif not self.is_pause:
self.played.pause()
self.is_pause = True
self.btnCon.setText('播放')
3.7.2.5上一首按鈕方法
'''上一首'''
def previewMusic(self):
self.slider.setValue(0)
self.is_pause = True
if len(self.songs_list) == 0 :
self.setStatusTip('當(dāng)前路徑內(nèi)無(wú)可播放的音樂(lè)文件')
return
if self.index != 0:
self.index-=1
else:
self.index = len(self.songs_list)-1
print(self.index)
self.setCurPlaying()
self.playMusic()
3.7.2.6下一首按鈕方法
'''下一首'''
def nextMusic(self):
self.slider.setValue(0)
self.is_pause = True
if len(self.songs_list) == 0 :
self.setStatusTip('當(dāng)前路徑內(nèi)無(wú)可播放的音樂(lè)文件')
return
if self.index != len(self.songs_list)-1:
self.index+=1
else:
self.index=0
self.setCurPlaying()
self.playMusic()
3.7.2.7設(shè)置當(dāng)前播放的音樂(lè)
def setCurPlaying(self):
self.cur_playing_song = self.songs_list[self.index]
print(self.cur_playing_song)
url = QUrl.fromLocalFile(self.cur_playing_song)
print(url)
self.played.setMedia(QMediaContent(url))
3.7.2.8播放模式
def playByMode(self):
if not self.is_pause:
self.slider.setMinimum(0)
self.slider.setMaximum(self.played.duration())
self.slider.setValue(self.slider.value() + 1000)
# 順序播放
if self.played.position() == self.played.duration():
self.nextMusic()
self.played.play()
3.7.2.9其他方法
def closeEvent(self, event):
"""
重寫(xiě)closeEvent方法邦投,實(shí)現(xiàn)dialog窗體關(guān)閉時(shí)執(zhí)行一些代碼
:param event: close()觸發(fā)的事件
:return: None
"""
reply = QMessageBox.question(self,
'本工具',
"是否要退出程序?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
3.8翻譯功能
3.8.1翻譯界面
#翻譯
class TranslationUi(QWidget):#建立第三個(gè)窗口的類(lèi)
def __init__(self):
super(TranslationUi, self).__init__()
self.init_ui()
self.Translate_text=''
self.HistoricalTranslation={}
self.getHistoricalTranslation()
def init_ui(self):
font = QFont()
font.setFamily("Arial") #括號(hào)里可以設(shè)置成自己想要的其它字體
font.setPointSize(18)
self.setWindowIcon(QIcon('翻譯.ico'))
self.resize(900, 350)#設(shè)置第三個(gè)窗口代碼
self.setWindowTitle('中英互譯')#設(shè)置第三個(gè)窗口標(biāo)題
self.btn = QPushButton('返回', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn.setGeometry(450, 50, 100, 50)#前面是按鈕左上角坐標(biāo)羔杨,后面是按鈕大小
self.btn.clicked.connect(self.slot_btn_function)#將信號(hào)連接到槽
self.btn.setIcon(QIcon("icon.png"))
self.le1 = QLineEdit(self)
self.le1.setGeometry(10, 50,300,50)
self.le1.textChanged.connect(self.getCon)
self.le1.setFont(font)
self.btn1 = QPushButton('翻譯', self)#設(shè)置按鈕和按鈕名稱(chēng)
self.btn1.setGeometry(330, 50, 100, 50)#前面是按鈕左上角坐標(biāo)性誉,后面是按鈕大小
self.btn1.clicked.connect(self.getTranslate)#將信號(hào)連接到槽
self.le2 = QLineEdit(self)
self.le2.setGeometry(10, 100,150,30)
self.le2.setText("翻譯結(jié)果:")
self.le2.setFont(font)
self.le2.setFocusPolicy(Qt.NoFocus)
self.le2.setStyleSheet('background:transparent;border:none')
self.le3 = QLineEdit(self)
self.le3.setGeometry(330, 100,150,30)
self.le3.setText("歷史翻譯:")
self.le3.setFont(font)
self.le3.setFocusPolicy(Qt.NoFocus)
self.le3.setStyleSheet('background:transparent;border:none')
self.tableWidget = QTableWidget(self)
self.tableWidget.setColumnCount(3)
self.tableWidget.setRowCount(4)
j = 0#第幾行(從0開(kāi)始)
i = 0#第幾列(從0開(kāi)始)
self.tableWidget.setHorizontalHeaderLabels(['時(shí)間','翻譯文本','結(jié)果'])
self.tableWidget.setColumnWidth(1,150)#設(shè)置j列的寬度
self.tableWidget.setColumnWidth(2,260)#設(shè)置j列的寬度
self.tableWidget.setRowHeight(i,30)#設(shè)置i行的高度
self.tableWidget.setColumnWidth(0,180)#設(shè)置0列的寬度
self.tableWidget.verticalHeader().setVisible(False)#隱藏垂直表頭
self.tableWidget.setGeometry(330,150,500,150)
self.text1 = QTextEdit(self)
self.text1.setFocusPolicy(Qt.NoFocus)
self.text1.setGeometry(10,150,300,150)
self.text1.setFont(font)
3.8.2翻譯方法
3.8.2.1獲取翻譯內(nèi)容
def getCon(self):
self.Translate_text=self.le1.text()
3.8.2.2爬取翻譯結(jié)果
def getTranslate(self):
if self.Translate_text=='':
return
Request_URL="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
form_data={}
form_data['i']=self.Translate_text
#print(form_data['from']+form_data['to'])
form_data['smartresult'] = 'dict'
form_data['doctype']='json'
form_data['version']='2.1'
form_data['keyfrom']='fanyi.web'
form_data['action']='FY_BY_CLICKBUTTION'
form_data['typoResult']='false'
data=parse.urlencode(form_data).encode('utf-8')
response=request.urlopen(Request_URL,data)
html=response.read().decode('utf-8')
translate_results = json.loads(html)
print(translate_results)
# 找到翻譯結(jié)果
translate_result = translate_results["translateResult"][0][0]['tgt']
self.text1.setText(translate_result)
self.localDir = os.getcwd()
self.textDir = self.localDir+'/翻譯文本.txt'
with open(self.textDir,"a+",encoding='utf-8') as f:
f.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+"http://"+self.Translate_text+'//'+translate_result+'\n')
f.close()
self.getHistoricalTranslation()
3.8.2.3獲取歷史翻譯記錄
def getHistoricalTranslation(self):
self.localDir = os.getcwd()
self.count=0
self.index =0
self.lists=[]
self.textDir = self.localDir+'/翻譯文本.txt'
if not os.path.exists(self.textDir):
open(self.textDir,'w')
with open(self.textDir,"r",encoding='utf-8') as f:
for line in f.readlines():
#print(self.count)
print(line)
self.lists.append(line)
self.count +=1
self.tableWidget.setRowCount(self.count)
for list in self.lists:
self.tableWidget.setItem(self.index, 0, QTableWidgetItem(list.split("http://")[0]))
self.tableWidget.setItem(self.index, 1, QTableWidgetItem(list.split("http://")[1]))
self.tableWidget.setItem(self.index, 2, QTableWidgetItem(list.split("http://")[2]))
self.index+=1
f.close()
3.8.2.4其他方法
def slot_btn_function(self):
self.hide()#隱藏此窗口
self.f = FirstUi()#將第一個(gè)窗口換個(gè)名字
self.f.show()#將第一個(gè)窗口顯示出來(lái)
def closeEvent(self, event):
"""
重寫(xiě)closeEvent方法窿吩,實(shí)現(xiàn)dialog窗體關(guān)閉時(shí)執(zhí)行一些代碼
:param event: close()觸發(fā)的事件
:return: None
"""
reply = QMessageBox.question(self,
'本工具',
"是否要退出程序?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
3.9主函數(shù)
def main():
app = QApplication(sys.argv)
w = FirstUi()#將第一和窗口換個(gè)名字
w.show()#將第一和窗口換個(gè)名字顯示出來(lái)
sys.exit(app.exec_())#app.exet_()是指程序一直循環(huán)運(yùn)行直到主窗口被關(guān)閉終止進(jìn)程(如果沒(méi)有這句話错览,程序運(yùn)行時(shí)會(huì)一閃而過(guò))
if __name__ == '__main__':#只有在本py文件中才能用纫雁,被調(diào)用就不執(zhí)行
main()
4. 實(shí)驗(yàn)結(jié)果。
4.1日歷
4.1.1日歷界面
4.1.2選擇月份
4.1.3選擇年份
4.2字符畫(huà)轉(zhuǎn)換
4.2.1選擇圖片
4.2.2轉(zhuǎn)換圖片
4.2.3打開(kāi)輸出的文件
4.3計(jì)算器
4.4視頻下載/轉(zhuǎn)換功能
4.4.1下載
4.4.2下載完成
4.4.3 FLV視頻轉(zhuǎn)換MP4選擇視頻
4.4.4 FLV視頻轉(zhuǎn)換MP4開(kāi)始轉(zhuǎn)換
4.4.5轉(zhuǎn)換成功
4.5音樂(lè)播放器
4.5.1音樂(lè)界面
4.5.2打開(kāi)文件夾
4.5.3播放
4.5.4暫停
4.6翻譯
4.6.1翻譯主界面
4.6.2中譯英
4.6.3英譯中
4.6.4歷史翻譯
4.7主界面
5. 總結(jié)和展望倾哺。
5.1總結(jié)
從制作本程序的過(guò)程中收獲了很多轧邪,對(duì)于庫(kù)包的調(diào)用,qt庫(kù)的使用有了一定的提升羞海,對(duì)于python在其他方面的應(yīng)用也有了進(jìn)一步的認(rèn)識(shí)忌愚,軟件還可以進(jìn)一步的提升以及擴(kuò)展。
5.2不足
軟件制作的還不是特別完善却邓,仍需要繼續(xù)打磨硕糊,有些bug可能未發(fā)現(xiàn)。