Python制作的工具箱

摘要

本軟件為使用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)框架

圖1 系統(tǒng)結(jié)構(gòu)框架.png

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日歷界面

圖2 日歷界面.png

4.1.2選擇月份

圖3 選擇月份.png

4.1.3選擇年份

圖4 選擇年份.png

4.2字符畫(huà)轉(zhuǎn)換

4.2.1選擇圖片

圖5 選擇圖片.png

4.2.2轉(zhuǎn)換圖片

圖6 轉(zhuǎn)換圖片.png

4.2.3打開(kāi)輸出的文件

圖7 對(duì)比轉(zhuǎn)換文件與原圖片.png

4.3計(jì)算器

圖8 計(jì)算器界面.png

4.4視頻下載/轉(zhuǎn)換功能

4.4.1下載

圖9 下載視頻.png
圖10 下載視頻中.png

4.4.2下載完成

圖11 下載完成.png
圖12 播放測(cè)試.png

4.4.3 FLV視頻轉(zhuǎn)換MP4選擇視頻

圖13 打開(kāi)要轉(zhuǎn)換的文件.png

4.4.4 FLV視頻轉(zhuǎn)換MP4開(kāi)始轉(zhuǎn)換

圖14 轉(zhuǎn)換中.png

4.4.5轉(zhuǎn)換成功

圖15 轉(zhuǎn)換完成.png
圖16 播放測(cè)試.png

4.5音樂(lè)播放器

4.5.1音樂(lè)界面

圖17 音樂(lè)播放器主界面.png

4.5.2打開(kāi)文件夾

圖18 打開(kāi)文件夾.png

4.5.3播放

圖19 播放音樂(lè).png

4.5.4暫停

圖20 暫停音樂(lè).png

4.6翻譯

4.6.1翻譯主界面

圖21 翻譯主界面.png

4.6.2中譯英

圖22 中譯英.png

4.6.3英譯中

圖23 英譯中.png

4.6.4歷史翻譯

圖24 歷史翻譯記錄.png

4.7主界面

圖25 軟件主界面.png

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)。

前往Github下載源碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腊徙,一起剝皮案震驚了整個(gè)濱河市简十,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撬腾,老刑警劉巖螟蝙,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異民傻,居然都是意外死亡胰默,警方通過(guò)查閱死者的電腦和手機(jī)场斑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)初坠,“玉大人和簸,你說(shuō)我怎么就攤上這事〉蹋” “怎么了锁保?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)半沽。 經(jīng)常有香客問(wèn)我爽柒,道長(zhǎng),這世上最難降的妖魔是什么者填? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任浩村,我火速辦了婚禮,結(jié)果婚禮上占哟,老公的妹妹穿的比我還像新娘心墅。我一直安慰自己,他們只是感情好榨乎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布怎燥。 她就那樣靜靜地躺著,像睡著了一般蜜暑。 火紅的嫁衣襯著肌膚如雪铐姚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天肛捍,我揣著相機(jī)與錄音隐绵,去河邊找鬼。 笑死拙毫,一個(gè)胖子當(dāng)著我的面吹牛依许,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缀蹄,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼悍手,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了袍患?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤竣付,失蹤者是張志新(化名)和其女友劉穎诡延,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體古胆,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肆良,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年筛璧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惹恃。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夭谤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巫糙,到底是詐尸還是另有隱情朗儒,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布参淹,位于F島的核電站醉锄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浙值。R本人自食惡果不足惜恳不,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望开呐。 院中可真熱鬧烟勋,春花似錦、人聲如沸筐付。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)家妆。三九已至鸵荠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伤极,已是汗流浹背蛹找。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哨坪,地道東北人庸疾。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像当编,于是被迫代替她去往敵國(guó)和親届慈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354