Python键盘库在输入过多字符时的问题

1 投票
1 回答
30 浏览
提问于 2025-04-13 14:46

我正在创建一个自动化程序,它可以复制当前选中的单元格的信息,并把这些信息保存到一个变量里。虽然这个功能可以正常工作,但当我尝试使用 keyboard 库或者 pyautoguiwrite 函数在记事本中输入这个变量时,输入的字符超过2到4个就会出现问题。如果我尝试输入更多的字符,比如9个,就会开始出现延迟或卡顿。我不知道该怎么办,因为我试过很多库,但都没有效果。我只想让这个程序在记事本中写入这个变量。

这个程序有一个功能,可以复制Excel中选中的单元格,并把它保存到一个全局变量里。然后,它会使用 pyautogui 向下移动一个单元格。这是我现在的代码:

import win32com.client as win32
import pyautogui
import global_variables


def copiar():
    try:
        excel = win32.GetActiveObject("Excel.Application")
    except:
        print("Excel not found.")
        return

    # Obter o nome da planilha ativa
    workbook_name = excel.ActiveWorkbook.Name

    # Se a planilha ativa não for a desejada, você pode abrir a planilha usando o seu caminho
    if workbook_name != 'CONEMB_ZLE.xlsx':
        # Exibe uma mensagem de aviso
        print("Excel not found, open.")
        return

    # Tornar o Excel visível
    excel.Visible = True

    # Selecionar a planilha ativa
    sheet = excel.ActiveSheet

    # Obter o valor da célula selecionada
    global_variables.valor_global = sheet.Application.Selection.Text

    # Imprimir o valor
    #print(global_variables.valor_global)

    # Pressionar a tecla de seta para baixo no teclado
    pyautogui.press('down')

这是将信息粘贴到记事本中的代码:

while True:

    focus = pygetwindow.getWindowsWithTitle('CONEMB_ZLE - Excel')[0]
    focus.activate()
    copiar()
    item = global_variables.valor_global
    focus = pygetwindow.getWindowsWithTitle('transportadora - Bloco de notas')[0]
    focus.activate()
    print(item)

    keyboard.write(item)

    sleep(2)

    keyboard.press('enter')

程序从Excel标签开始,复制数据。然后它切换到记事本标签,并在记事本中写入包含数据的变量。

1 个回答

1

其实很简单,你不需要用 keyboard.write() 这个函数,因为你可以直接把变量粘贴进去。在这里,我选择使用 pyperclip。我测试代码的时候发现,pyperclip.paste() 在终端以外的其他应用里不太好使,所以我想出了一个备用方案。首先,把要复制的内容放到剪贴板:

#import pyperclip
pyperclip.copy(item)

接下来就看你想怎么粘贴了。在这种情况下,你可以用 keyboard 来按 'ctrl+v':

#import pyperclip
pyperclip.copy(item)
keyboard.press_and_release('ctrl+v')

另外,如果这个方法不行,你也可以试试用 pyautogui.typewrite()

pyautogui.typewrite(item)

不过我觉得复制和粘贴的方法是最有效的,应该能解决延迟的问题。

撰写回答