獲取控件屏幕座標
由於 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
即可。