Python自動獲取Typora屏幕座標將Markdown文件轉爲html文件

獲取控件屏幕座標

由於 Typora 軟件是多進程,並且使用工具 Pywinauto 查看其 control_type 是 Pane,不能像網上介紹的 notepad 的樣例那樣去使用,因此這裏使用工具 PyAutoGUI,根據界面屏幕座標去操作 Typora 軟件。

由於這類控件沒有 API 方法,因此只能通過 print_control_identifiers() 方法打印出控件的屏幕座標信息,通過從控制檯獲取打印的信息,並進行處理得到控件的座標信息,通過座標值來操作此類控件,具體實現可以看下面的代碼:

# 獲取控制檯打印的內容
class TextArea(object):
    def __init__(self):
        self.buffer = []
    def write(self, *args, **kwargs):
        self.buffer.append(args)
        
# 獲取應用程序Typora指定標識符的屏幕座標
def GetAppIdentifierPos(app, identifier):
    # 獲取控件信息
    stdout = sys.stdout
    sys.stdout = TextArea()
    app["Typora"].print_control_identifiers()
    text_area, sys.stdout = sys.stdout, stdout
    # 搜索標識符的屏幕座標
    for tup in text_area.buffer:
        i = tup[0].find(identifier)
        if i > -1:
            # 用於存控件的座標
            locate = []
            starti = i + len(identifier)
            startj = tup[0].find('(', starti, -1) + 1
            endj = tup[0].find(')', starti, -1)
            grid = tup[0][startj:endj].split(',')
            for gridi in grid:
                gridj = gridi.strip()
                gridk = int(gridj[1:])
                locate.append(gridk)
                
            return [(locate[0]+locate[2])/2, (locate[1]+locate[3])/2]
            
    return [0, 0]

Python自動化腳本用Typora將Markdown文件轉爲html文件

如果手動輸入屏幕座標,則可以參照 https://blog.csdn.net/he_nan/article/details/106108344

本文在轉換前,首先用工具 Pyautogui 自動獲取各個控件的屏幕座標,然後再轉換所有的 Markdown 文件,Python 腳本實現如下:

# 退出Typora軟件
def QuitTypora(quitAppCoor):
    time.sleep(2)
    pyautogui.hotkey('ctrl', 'w')
    time.sleep(2)
    pyautogui.click(quitAppCoor[0], quitAppCoor[1])
    time.sleep(5)
    
# 將指定目錄下的單個md文件轉換爲html文件
def ConvertMdToHtml(typoraApp, inFileCoor, fileMenuCoor, exportCoor, htmlCoor, outFileCoor, quitAppCoor, mdFile):
    # 打開Typora應用程序
    app = pywinauto.application.Application(backend="uia").start(typoraApp)
    time.sleep(5)
    # 打開md文件
    pyautogui.hotkey('ctrl', 'o')
    time.sleep(2)
    pyautogui.click(inFileCoor[0], inFileCoor[1])
    pyautogui.typewrite(mdFile)
    pyautogui.press('enter', presses=1, interval=0.5)
    time.sleep(1)
    # 導出html
    pyautogui.click(fileMenuCoor[0], fileMenuCoor[1])
    time.sleep(1)
    pyautogui.click(exportCoor[0], exportCoor[1])
    time.sleep(1)
    pyautogui.click(htmlCoor[0], htmlCoor[1])
    time.sleep(2)
    pyautogui.click(outFileCoor[0], outFileCoor[1])
    pyautogui.hotkey('ctrl', 'a')
    pyautogui.typewrite(mdFile[:-2] + FileFormat.HtmlFileSuffix())
    pyautogui.press('enter', presses=1, interval=0.5)
    time.sleep(1)
    pyautogui.press('left', presses=1, interval=0.1)
    pyautogui.press('enter', presses=1, interval=0.5)
    # 關閉Typora
    QuitTypora(quitAppCoor)
    
# 將指定目錄下的所有md文件轉換爲html文件
def ConvertAllMdToHtml(typoraApp, mdFilesDir):
    # 退出Typora時“放棄”修改按鈕的屏幕座標
    app = pywinauto.application.Application(backend="uia").start(typoraApp)
    time.sleep(5)
    pyautogui.typewrite("Typora")
    time.sleep(1)
    pyautogui.hotkey('ctrl', 'w')
    time.sleep(2)
    quitAppCoor = GetAppIdentifierPos(app, u"Button - '丟棄'")
    pyautogui.click(quitAppCoor[0], quitAppCoor[1])
    time.sleep(5)
    # 打開文件時輸入框的屏幕座標
    app = pywinauto.application.Application(backend="uia").start(typoraApp)
    time.sleep(5)
    pyautogui.typewrite("Typora")
    time.sleep(1)
    pyautogui.hotkey('ctrl', 'o')
    time.sleep(2)
    inFileCoor = GetAppIdentifierPos(app, u"ComboBox - '文件名(N):'")
    pyautogui.press('esc', presses=1, interval=0.5)
    QuitTypora(quitAppCoor)
    # 導出文件時導航菜單及輸入框的屏幕座標
    app = pywinauto.application.Application(backend="uia").start(typoraApp)
    time.sleep(5)
    pyautogui.typewrite("Typora")
    time.sleep(1)
    fileMenuCoor = GetAppIdentifierPos(app, u"MenuItem - '文件(F)'")
    pyautogui.click(fileMenuCoor[0], fileMenuCoor[1])
    time.sleep(1)
    exportCoor = GetAppIdentifierPos(app, u"MenuItem - '導出'")
    pyautogui.click(exportCoor[0], exportCoor[1])
    time.sleep(1)
    htmlCoor = GetAppIdentifierPos(app, u"MenuItem - 'HTML'")
    pyautogui.click(htmlCoor[0], htmlCoor[1])
    time.sleep(2)
    outFileCoor = GetAppIdentifierPos(app, u"ComboBox - '文件名:'")
    pyautogui.press('esc', presses=1, interval=0.5)
    QuitTypora(quitAppCoor)
    
    # 篩選指定目錄下的文件
    for root, dirs, files in os.walk(mdFilesDir):
        for name in files:
            if FileFormat.IsMdFile(name):
                mdFile = os.path.join(root, name)
                ConvertMdToHtml(typoraApp, inFileCoor, fileMenuCoor, exportCoor, htmlCoor, outFileCoor, quitAppCoor, mdFile)

全部的完整腳本,見附件。

腳本放在與 Document 同級的目錄下,直接執行 Markdown2Html.py 即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章