1. 程式人生 > 其它 >文字轉語音或語音播報功能

文字轉語音或語音播報功能

技術標籤:pythonpython

Python小工具

簡介

前兩個星期在進行學習的時候發現Py寫小工具效果非常好,於是花了點時間順帶著學習了一下py,也嘗試著使用已經學習的py知識進行了一個兩個小工具的開發。下面是我開發的成果。

程式碼部分

程式碼一

程式碼作用: 本程式碼的作用為將指令碼所在目錄的檔案打包(doyoutrustme)傳送到對應的伺服器。

注意事項: 該程式碼的執行效率並不高,缺少重複檔案判斷部分,大家如果比較注重效率或者重視指令碼執行的速度的話可以嘗試在此程式碼的基礎上讓指令碼儲存一個md5的文件(算出所有的檔案的md5值),然後複製的時候進行比較,如果md5值相同,那麼不需要進行復制。

import os
import shutil
import sys
import paramiko

path = sys.path[0]  #返回指令碼執行的當前目錄
files = os.listdir(path)

#伺服器相關資訊
ip = "192.168.2.221"#伺服器ip
port = 22#埠號
username = "root"#使用者名稱
password = "toor"#密碼

#掃描複製檔案到doyoutrustme這個資料夾內
def scan_and_sort_out(filelist,now_dir)
: if not os.path.exists('doyoutrustme'): os.makedirs('doyoutrustme') for f in filelist: shutil.copyfile(f, now_dir + '/doyoutrustme/' + f'{f}') else: for f in filelist: shutil.copyfile(f, now_dir + '/doyoutrustme/' + f'{f}') #壓縮doyoutrustme資料夾內的內容,並刪除doyoutrustme檔案
#暫時缺少重複檔案的判斷 def compression_and_delete_sort_out_file(file_path): shutil.make_archive(file_path + '/doyoutrustme/','zip',file_path + '/doyoutrustme/') shutil.rmtree(file_path + '/doyoutrustme/') #傳送程式執行的當前路徑以及打包壓縮好的檔案,並刪除壓縮的檔案 def send_compression_file(local,remote): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip, port, username, password) sftp = ssh.open_sftp() sftp.put(local, remote) scan_and_sort_out(files,path) compression_and_delete_sort_out_file(path) send_compression_file(path + '/doyoutrustme.zip','/root/Desktop/test2/' + '/doyoutrustme.zip') os.remove(path + '/doyoutrustme.zip')

程式碼比較簡單,也不需要太多的解釋,用的幾個庫以及其中的函式也很容易就找到相關的文件和解釋。

程式碼二

程式碼作用: 本程式碼的作用為將test4.xls表格內備註部分標註的檔案傳送到對應的QQ聯絡人。

表格格式: 表格格式
注意事項:
1.表格的格式一定不能錯,第一行一定是姓名和備註(當然換成其他的也行,程式中是從第二行開始掃描的,我這邊只是為了開發的方便所以並沒有根據表格中的內容進行掃描)
2.檔案的路徑最好是絕對路徑

#庫應用部分
import xlrd
import win32gui
import win32con
import win32api
import win32clipboard
from PyQt5 import QtCore, QtWidgets
import time



#函式定義部分
#選擇表函式
def get_excel(user_input):
    table = data.sheets()[user_input-1]
    print(table)
    return  table

#尋找單元格內的內容
def make_message(table):
    l = []
    row = 1
    col = 0
    for nrow in range(table.nrows-1):
        content = f'{table.row(row)[col+1].value}'  #讀取檔案路徑
        l.append(content)
        row += 1
    print(l)
    return l

#獲得單元格內的聯絡人
def get_human(table):
    human = []
    row = 1
    col = 0
    for nrow in range(table.nrows-1):
        human.append(table.row(row)[col].value)
        row += 1
    print('人員名單如下:')
    print(human)
    return human

#設定剪下板文字
def setText(massage):
    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, massage)
    win32clipboard.CloseClipboard()

#複製檔案到剪下板
def filesend(filepath):
    app = QtWidgets.QApplication([])
    data = QtCore.QMimeData()
    url = QtCore.QUrl.fromLocalFile(filepath)
    # QUrl.fromLocalFile(filename)的功能是使用QUrl的類函式fromLocalFile(),根據檔名filename建立一個指向此檔案的QUrl物件。
    data.setUrls([url])
    # 設定地址列表,引數為QUrl類的列表;
    app.clipboard().setMimeData(data)
    # 設定剪下板的值
    # clipboard = QtWidgets.QApplication.clipboard()兩種寫法效果一樣

def ctrlV():
    win32api.keybd_event(17,0,0,0)  #ctrl鍵位碼是17
    win32api.keybd_event(86,0,0,0)  #v鍵位碼是86
    win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0) #釋放按鍵
    win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)

def scan():
    hwnd_title = dict()
    if num == 0:
        def get_all_hwnd(hwnd, mouse):
            if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
                hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})
        win32gui.EnumWindows(get_all_hwnd, 0)
    else:
        pass
    return hwnd_title

def open_windows_and_send(name_list,message_list,num):
    qq_hwnd = win32gui.FindWindow('TXGuiFoundation', 'QQ')
    print("捕捉到QQ主窗體的控制代碼為:"+str(qq_hwnd))
    win32gui.ShowWindow(qq_hwnd,win32con.SW_SHOW)
    print("正在開啟會話視窗...\n")
    time.sleep(1)
    for i in name_list: #改為if更好一點
        name = i
        setText(name)
        win32gui.SetForegroundWindow(qq_hwnd)
        win32gui.SetActiveWindow(qq_hwnd)
        time.sleep(0.8)
        win32gui.SendMessage(qq_hwnd,770, 0, 0)
        time.sleep(0.8)
        win32gui.SendMessage(qq_hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)  # 模擬按下回車鍵
        win32gui.SendMessage(qq_hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0)  # 模擬鬆開回車鍵
        time.sleep(0.8)
        win32gui.SetForegroundWindow(qq_hwnd)
        win32gui.SetActiveWindow(qq_hwnd)
        win32api.keybd_event(0x0D, win32api.MapVirtualKey(0x0D, 0), 0, 0)
        win32api.keybd_event(0x0D, win32api.MapVirtualKey(0x0D, 0), win32con.KEYEVENTF_KEYUP, 0)

        hwnd_title = scan()
        for h, t in hwnd_title.items():
            if t != "" and t != "QQ" and t != "小火箭通用加速":
                hwnd = win32gui.FindWindow('TXGuiFoundation', t)  # 獲取qq視窗控制代碼
                if hwnd != 0:
                    message = message_list[num]
                    filesend(message)
                    time.sleep(0.5)
                    win32gui.SetForegroundWindow(hwnd)
                    win32gui.SetActiveWindow(hwnd)
                    ctrlV()
                    time.sleep(1)
                    win32gui.SendMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)  # 模擬按下回車鍵
                    win32gui.SendMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0)  # 模擬鬆開回車鍵
        win32api.keybd_event(0x0D, win32api.MapVirtualKey(0x0D, 0), 0, 0)
        win32api.keybd_event(0x0D, win32api.MapVirtualKey(0x0D, 0), win32con.KEYEVENTF_KEYUP, 0)
        num += 1

excel_path = './test4.xls'
data = xlrd.open_workbook(excel_path)
count = str(1)
for i in data.sheet_names():
    print(count + '.' + i)
    count = str(1 + int(count))

#選擇表單操作
print('請選擇要使用的表單:')
user_input = int(input())
user_use_sheet = data.sheet_names()[user_input-1]
print('你選擇了' + user_use_sheet + '表格')

table = get_excel(user_input)
message = make_message(table)
human = get_human(table)
num = 0
open_windows_and_send(human,message,num)

在這個工具程式碼中,運用到了相當多的函式和函式庫,但是絕大部分也是有對應的文件解釋的,這裡我給出win32這幾個庫的一些文件。

win32 API含義: https://www.cnblogs.com/jackcovey/archive/2007/08/11/852051.html
win32 API使用: http://www.gimoo.net/t/1809/5bb053298c7da.html

在進行操作的過程中,我意識到了一些問題,我並沒有什麼有效的方法能讓程式碼一和程式碼二自動執行(在程式碼二將程式碼一檔案傳送到相應的聯絡人的時候,程式碼一併不能自動執行)。我意識到可以使用類似中斷的方式進行自動呼叫(目前正在嘗試)。

總結:

在此次的學習中最主要的就是學會了怎麼去檢視Py庫的使用方式,順便用這兩個小工具練了一下手。

長路漫漫,學習相伴。