from pathlib import Path import datetime import glob import logging import os import shutil import time from pywinauto import Desktop, actionlogger, mouse, keyboard from pywinauto.application import Application from pywinauto.timings import Timings from settings import * def mouse_click(ws): r = ws.rectangle() coords = (r.left + r.right)//2, (r.top + r.bottom)//2 mouse.move(coords=coords) time.sleep(0.1) mouse.click(coords=coords) time.sleep(0.1) # mouse.press(coords=coords) # mouse.release(coords=coords) def login(id=USER_ID, pw=PASSWORD): # Timings.fast() # Timings.window_find_timeout = 10 patterns = [ # '另存新檔.*' '.* - Microsoft​ Edge$', '.*日期:.*', ] for p in patterns: while True: quit = False try: w = Desktop(backend="uia").window(title_re=p) logging.warning(p + str(w)) w.close() except: quit = True if quit: break app = Application(backend="uia").start(r'C:\Users\xfr\Desktop\PACS.exe') w = Desktop(backend="uia").window(title_re='.* - Microsoft​ Edge$') w.wait('ready') # time.sleep(9) app = Application(backend="uia").connect(title_re='.* - Microsoft​ Edge$') # app.wait_cpu_usage_lower(threshold=50) # dlg_spec = Desktop(backend="uia").window(title_re='.* - Microsoft​ Edge$') window = app.window(title_re='.* - Microsoft​ Edge$') # dlg_spec = app.top_window() window['使用者帳號: \xa0Edit'].set_text(id) window['使用者密碼: \xa0Edit'].set_text(pw) # r = window['登入Static'].rectangle() # coords = (r.left + r.right)//2, (r.top + r.bottom)//2 # mouse.click(coords=coords) mouse_click(window['登入Static']) time.sleep(9) return app, window def dump(pane): print(pane) print(dir(pane)) print(pane.element_info) print(pane.get_properties()) print(pane.print_control_identifiers()) # print(len(pane.children())) # TDicomTagListForm = None def save_tag(window, outdir): global TDicomTagListForm mouse_click(window['註釋/標籤']) TDicomTagListForm = window['DICOM 標籤清單Dialog'] if TDicomTagListForm.exists(): TDicomTagListForm.close() TDicomTagListForm.wait_not('exists', 30) TToolBar = window.child_window(class_name='TToolBar', found_index=2) Button5 = TToolBar.Button5 Button5.wait('ready', 10) # time.sleep(2) mouse_click(Button5) export_to_file = window['輸出至檔案'] export_to_file.wait('ready', 99) export = export_to_file.wrapper_object() export.click() TDicomTagListForm = window['DICOM 標籤清單Dialog'] dlg_save = Desktop(backend="uia").window(title='另存新檔') NEdit = dlg_save['檔案名稱(N):Edit'] NEdit.wait('ready', 99) edit = NEdit.wrapper_object() pahtname = os.path.join(outdir, edit.get_value()) for p in glob.glob(pahtname + '*'): os.remove(p) edit.set_text(pahtname) dlg_save['存檔(S)Button'].wrapper_object().click() TDicomTagListForm.close() # logging.warning("TDicomTagListForm closing") # TDicomTagListForm.wait_not('exists', 60) # logging.warning("TDicomTagListForm not exists") return pahtname def save_study(chartno, outdir, only_tag): # TViewerForm # while True: # logging.warning('connecting '+chartno) # try: # app = Application(backend="uia").connect(title_re='^%s.*'%chartno) # break # except: # time.sleep(1) logging.warning('connecting '+chartno) app = Application(backend="uia").connect(title_re='.*%s.*'%chartno, timeout=300) shutil.rmtree(outdir, ignore_errors=True) os.makedirs(outdir, exist_ok=True) logging.warning(str(app)) window = app.top_window() # window.maximize() index = 0 while True: TFlowPanel = window.child_window(class_name='TFlowPanel', found_index=index) # dump(TFlowPanel) if TFlowPanel.control_count(): break index += 1 series = sorted(TFlowPanel.children(), key=lambda x: x.rectangle().left) c = series[0] c.set_focus() mouse_click(c) keyboard.send_keys('^i') # logging.warning(str(TFlowPanel.get_properties())) # print(str(TFlowPanel.get_properties())) # print(str(window.get_properties())) # window.dump_tree(filename='test.log') # exit() for c in series: logging.warning(str(c.element_info)) # c.wait('ready') #AttributeError: 'UIAWrapper' object has no attribute 'wait' c.set_focus() mouse_click(c) keyboard.send_keys('^{HOME}') time.sleep(.1) p = save_tag(window, outdir) mouse_click(c) keyboard.send_keys('^{END}') time.sleep(.1) p = save_tag(window, outdir) # mouse_click(c) # keyboard.send_keys('^{HOME}') # time.sleep(1) # p = save_tag(window, outdir) if not only_tag: keyboard.send_keys('^s') keyboard.send_keys('{DOWN}') keyboard.send_keys('{DOWN}') # time.sleep(9) # logging.warning(str(datetime.datetime.now())) TFormSaveBitmap = window['選項'] # TFormSaveBitmap.dump_tree(filename='z-%s-TFormSaveBitmap.txt'%chartno) TFormSaveBitmap.wait('ready') Edit5 = TFormSaveBitmap.Edit5 Edit5.wait('ready') Edit5.set_text(outdir) # TFormSaveBitmap.Edit5.set_text(outdir) TFormSaveBitmap.Button2.click() logging.warning('button clicked') time.sleep(.1) logging.warning('saving started') saving = window.child_window(title_re='^另存新檔.*') logging.warning('saving exists') saving.wait_not("exists", timeout=999) logging.warning('saving not exists') c.set_focus() mouse_click(c) keyboard.send_keys('^q') # window.wait_not('exists', 9) # while True: # try: # if not window.exists(): # break # except : # break # logging.warning(str((datetime.datetime.now()))) # c.set_focus() # mouse_click(c) # keyboard.send_keys('^q') # time.sleep(9) def save_patient(chartno, outdir, query = "CT,MR", only_tag=False): app = Application(backend="uia").connect(title_re='.* - Microsoft​ Edge$') logging.warning(str(app)) # window = app.window(title_re='.* - Microsoft​ Edge$') window=app.top_window() window.maximize() if query: window['病歷號:Edit'].set_text(chartno) window['儀器種類:Edit'].set_text(query) r = window['ComboBox關閉'].rectangle() coords = (r.left + r.right)//2, (r.top + r.bottom)//2 mouse.click(coords=coords) keyboard.send_keys('{UP}') keyboard.send_keys('{UP}') keyboard.send_keys('{ENTER}') window['Button'].click() time.sleep(9) ListItem = window['開啟影像'].parent() # print(ListItem.texts()) ListView = ListItem.parent() # shutil.rmtree(outdir, ignore_errors=True) # os.makedirs(outdir, exist_ok=True) items =[] rows = [] row = None LeftUpper = ListView.items()[0] mouse_click(LeftUpper) for item in ListView.items(): # logging.warning(str(item)) # logging.warning(str(dir(item))) # logging.warning(str(item.texts())) if item.texts()[0] == '開啟影像': if row: rows.append(row) # logging.warning(str(row)) items.append(item) row = [] if row is not None: row.append(item.texts()[0]) # if item.texts()[0] != '開啟影像': # continue # items.append(item) # logging.debug(str(item.rectangle())) rows.append(row) # logging.warning(str(row)) # logging.warning(str(len(items))) # logging.warning(str(items)) # exit() for i, item in enumerate(items): series_name = '%s_%s_%s' % (rows[i][5], rows[i][9], rows[i][10]) series_name = series_name.replace('/', '').replace(' ', '') complete_file = Path(f'{outdir}\\{series_name}.complete') if complete_file.is_file(): logging.warning('skip '+str(complete_file)) else: subdir = Path(f'{outdir}\\{series_name}') time.sleep(.3) logging.warning(str(item.get_properties())) mouse_click(item) save_study(chartno, subdir, only_tag) complete_file.touch() bottom = False logging.warning(str(items[i].rectangle())) try: if items[i+2].rectangle().top < 1: bottom = True except: bottom = True if bottom: logging.warning(str(item.get_properties())) item.set_focus() keyboard.send_keys('{DOWN}') logging.warning('{DOWN}') # r = item.rectangle() # coords = (r.left + r.right)//2, (r.top + r.bottom)//2 # mouse.scroll(coords=coords) time.sleep(.1) logging.warning(chartno+" completed "+query) return 0 # exit() actionlogger.enable() def main(): # FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s' FORMAT = '%(asctime)s %(message)s' logging.basicConfig(filename=__file__.replace('.py','.%s.log'%str(datetime.datetime.now()).replace(':','')), format=FORMAT) # logger = logging.getLogger('pywinauto') # logger.handlers[0] = logging.FileHandler(__file__.replace('.py','.log')) # logging.basicConfig(format=FORMAT) # formatter = logging.Formatter(FORMAT) # logger.handlers[0].setFormatter(formatter) app, window = login() save_patient('5344141', r'T:\0\5344141', query="CT,MR") # save_patient('5344141', r'T:\0\5344141', query="CT") # save_patient('2380784', r'T:\3\2380784', query=False) # save_study('2380784', outdir=r'T:\0\2380784') # step2() if __name__ == '__main__': main()