美文网首页
使用Python模拟鼠标(键盘)操作

使用Python模拟鼠标(键盘)操作

作者: shenghaishxt | 来源:发表于2019-03-04 19:30 被阅读0次

    本文来自我的个人博客 https://www.zhangshenghai.com/posts/42676/

    昨天在帮师兄做脑核磁共振图像的颅骨去除,使用的是一个桌面软件,需要输入所需要的文件,然后软件自动进行分割,手动做的话每例大概需要三四分钟,共两百多例,这样效率太低了,且实在是很不优雅。于是决定用python写一个脚本来自动模拟鼠标操作,使用的是pyautogui库,特此记录以便参考。

    首先进入base环境安装pyautogui库:

    activate base
    conda install -c jim-hart pyautogui
    

    因为需要输入的是4个nii文件,所以首先删除不需要的文件,保证文件夹内的文件数量\leq4

    src_dir = r"F:\0"
    need_file = ['t1c.nii', 't2.nii', 't1.nii', 'flair.nii']
    for dir in os.listdir(src_dir):
        dst_dir = os.path.join(src_dir, dir)
        for file in os.listdir(dst_dir):
            if (file not in need_file):
                os.remove(os.path.join(dst_dir, file))
    

    然后判断需要的4个文件是否都存在,去除不满足条件的病例。

    src_dir = r"F:\0"
    need_file = ['t1c.nii', 't2.nii', 't1.nii', 'flair.nii']
    for dir in os.listdir(src_dir):
        dst_dir = os.path.join(src_dir, dir)
        filenum = len([lists for lists in os.listdir(dst_dir) 
                       if os.path.isfile(os.path.join(dst_dir, lists))])
        if (filenum != 4):
            print(dst_dir)
    

    使用脚本控制鼠标太快了,可能会导致应用出问题,为了减缓鼠标点击速度,pyautogui提供了中断措施,为所有的pyatutogui函数增加延迟,默认的延迟是0.1s,这里做如下调整:

    pyautogui.PAUSE = 0.6
    

    接着确定各个按钮的坐标,坐标的位置可以用以下代码确定:

    x, y = pyautogui.position()
    print(x, y)
    

    这里用到的鼠标操作主要是移动、单击、双击和多次点击:

    pag.moveTo(x,y)
    pyautogui.click()
    pyautogui.doubleClick()
    pyautogui.click(clicks=10, interval=0.25)
    

    本来是有用到滚轮操作的,但是不知道什么原因,在代码中失效,也就放弃了这个操作,用多次点击代替。pyautogui这个库还是很强大的,也支持键盘操作,只不过这里不需要键盘操作也就没有用到。

    比较简单地介绍了使用python模拟鼠标(键盘)操作,以下是具体的源码:

    import pyautogui as pag
    import os
    import time
    
    screenWidth, screenHeight = pag.size()
    assert screenWidth == 1920
    assert screenHeight == 1080
    
    x, y = pag.position()
    print(x, y)
    
    pag.moveTo(700, 700)
    pag.PAUSE = 0.6
    
    pag.moveTo(folder_rightx, folder_righty)
    # pag.click(clicks=1, interval=0.25)
    
    loadx, loady = 18, 32
    patientx, patienty = 71, 56
    outputx, outputy = 1247, 666
    Fdiskx, Fdisky = 724, 425
    folderx, foldery = 695, 443
    folder_rightx, folder_righty = 981, 359
    t1_extrax, t1_extray = 712, 441
    t1x, t1y = 956, 380
    t1cx, t1cy = 956, 380+17
    t2x, t2y = 956, 380+35
    flairx, flariy = 956, 380-17
    load2x, load2y = 700, 700
    performx, performy = 121, 404
    next1x, next1y = 900, 724
    next2x, next2y = 1207, 742
    
    # set T1 as baseline
    blx, bly = 1230, 444
    
    for i in range(0, 1):
        print("current No: %d" % i)
        try:
            # open add patient
            pag.moveTo(loadx, loady)
            pag.click()
            pag.moveTo(patientx, patienty)
            pag.click()
        
            # open output folder
            pag.moveTo(outputx, outputy)
            pag.click()
            pag.moveTo(Fdiskx, Fdisky)
            pag.doubleClick()
            pag.moveTo(folderx, foldery)
            pag.doubleClick()
            
            if i == 0:
                pag.moveTo(folder_rightx, folder_righty)
            else:
                pag.moveTo(next2x, next2y)
                pag.click(clicks=i, interval=0.25)
                pag.moveTo(folder_rightx, folder_righty)
            
            pag.doubleClick()
        
            # set T1 path
            pag.moveTo(blx, bly)
            pag.click()
            
            if i == 0:
                pag.moveTo(t1_extrax, t1_extray)
            else:
                pag.moveTo(next1x, next1y)
                pag.click(clicks=i, interval=0.25)
                pag.moveTo(t1_extrax, t1_extray)
            
            pag.doubleClick()
            pag.moveTo(t1x, t1y)
            pag.doubleClick()
        
            # set T1c path
            pag.moveTo(blx, bly+38*1)
            pag.click()
            pag.moveTo(t1cx, t1cy)
            pag.doubleClick()
        
            # set t2 path
            pag.moveTo(blx, bly+38*2)
            pag.click()
            pag.moveTo(t2x, t2y)
            pag.doubleClick()
        
            # set Flair path
            pag.moveTo(blx, bly+38*3)
            pag.click()
            pag.moveTo(flairx, flariy)
            pag.doubleClick()
        
            # set Template (same as T1c)
            pag.moveTo(blx, bly+38*4)
            pag.click()
            pag.moveTo(t1cx, t1cy)
            pag.doubleClick()
        
            # load
            pag.moveTo(load2x, load2y)
            pag.click()
            time.sleep(3)
            
            # perform
            pag.moveTo(performx, performy)
            pag.click()
            
            # performing
            #time.sleep(60)
        
        except:
            print("No.%d is Error" % i)
      
    # 删除不需要的文件,保证文件夹内文件数量小于等于4
    src_dir = r"F:\0"
    need_file = ['t1c.nii', 't2.nii', 't1.nii', 'flair.nii']
    for dir in os.listdir(src_dir):
        dst_dir = os.path.join(src_dir, dir)
        for file in os.listdir(dst_dir):
            if (file not in need_file):
                os.remove(os.path.join(dst_dir, file))
                
    # 判断需要的四个文件是否都存在
    src_dir = r"F:\0"
    need_file = ['t1c.nii', 't2.nii', 't1.nii', 'flair.nii']
    for dir in os.listdir(src_dir):
        dst_dir = os.path.join(src_dir, dir)
        filenum = len([lists for lists in os.listdir(dst_dir) 
                       if os.path.isfile(os.path.join(dst_dir, lists))])
        if (filenum != 4):
            print(dst_dir)      
    

    相关文章

      网友评论

          本文标题:使用Python模拟鼠标(键盘)操作

          本文链接:https://www.haomeiwen.com/subject/jghwuqtx.html