【问题标题】:Issue copying to clipboard using tkinter and pyautogui使用 tkinter 和 pyautogui 复制到剪贴板
【发布时间】:2019-08-04 06:37:54
【问题描述】:

我正在开发一个自动化程序来审查/测试第三方应用程序中的内容。目前我正在使用 pyautogui 突出显示和复制值(至少在我们可以访问应用程序数据库之前)和 tkinter 从剪贴板中检索数据。

下面的脚本可以复制可以在屏幕上突出显示的内容(在脚本的#get manager 部分下)。

但是,当我导航到具有文本正文的部分(#QAR 测试 2)时,使用 pyautogui.hotkey("Ctrl","a") 突出显示所有内容并使用 pyautogui.hotkey("Ctrl","c ") 进行复制时,似乎剪贴板未填充(由于尝试打印分配给它的变量时出现错误消息)。

作为参考,我附上了目标文本的屏幕截图。不能将文本(特别是段落)复制到剪贴板吗?

#QAR 测试 2 后出现的错误消息是:

Traceback (most recent call last):
  File "C:/Users/haudrxr/Downloads/PCA_5_5_18_QAR.py", line 92, in <module>
    background_tm= copy_clipboard()
  File "C:/Users/haudrxr/Downloads/PCA_5_5_18_QAR.py", line 10, in copy_clipboard
    clipboard = Tk().clipboard_get()
  File "C:\Users\haudrxr\AppData\Local\Continuum\anaconda3\lib\tkinter\__init__.py", line 804, in clipboard_get
    return self.tk.call(('clipboard', 'get') + self._options(kw))
_tkinter.TclError: CLIPBOARD selection doesn't exist or form "STRING" not defined

...
#Get Manager Value
x=115
y=450
for i in range (10):
    pyautogui.click(x, y)
    time.sleep(1)
    pyautogui.doubleClick(839, 567)
    pyautogui.hotkey("Ctrl","c")
    level=copy_clipboard()
    y += 23
    if level=="1":
        pyautogui.mouseDown(750, 437,button="left",duration=1)
        pyautogui.dragTo(1049, 437,1, button='left')
        pyautogui.hotkey("Ctrl", "c")
        staffname = copy_clipboard()
        if len(staffname)>1:
            team_tab.append(staffname)
            print(team_tab)
    else:
        continue

    team_tab = list(filter(None, team_tab))  # fastest
    print(len(team_tab))
if len(team_tab)>2:
    print("QAR Item 1: PASS")
else:
    print("QAR Item 1: FAIL")

#QAR Test 2
if windll.user32.OpenClipboard(None):
    windll.user32.EmptyClipboard()
    windll.user32.CloseClipboard()
pyautogui.click(262, 162) # navigates to tab with text box
pyautogui.click(614, 314) #clicks in text box
pyautogui.hotkey("Ctrl", "a")
pyautogui.hotkey("Ctrl", "c")
background_tm= copy_clipboard()
time.sleep(10)
print(background_tm)
print("test1")

【问题讨论】:

  • 您说“由于错误消息”,但没有引用错误消息-您不认为这可能是一个重要的细节吗? (我怀疑你在发送 Ctrl-C 和检查剪贴板之间只需要一点延迟,让其他程序有机会实际做任何事情。)
  • 好点,我正在更新条目以包含错误消息。谢谢!
  • 在尝试访问剪贴板数据之前尝试添加一个非常小的暂停,因为键盘快捷键不是即时的。这在另一个 SO 线程中的代码注释“ctrl-c is usually very fast but your program may execute faster”中注明:stackoverflow.com/a/51505977/7496549)

标签: python tkinter pycharm pyautogui


【解决方案1】:

根据@TerryJanReedy ,错误说剪贴板中没有任何内容,甚至没有空字符串。
所以先尝试在其中添加一些东西。
试试:

From time import sleep
from tkinter import Tk
try:
    r=Tk()
    r.clipboard_clear()
    r.clipboard_append('testing ')
    result = r.selection_get(selection="CLIPBOARD")
    sleep(1)
except:
    selection = None

【讨论】:

    【解决方案2】:

    正如我在评论中提到的,control-c 快捷方式不会立即起作用:

    在尝试访问剪贴板数据之前尝试添加一个非常小的暂停,因为键盘快捷键不是即时的。这在另一个 SO thread 中的代码注释“ctrl-c 通常非常快,但您的程序可能执行得更快”中有说明)

    在这种情况下,我会将sleep 移动到您获取剪贴板内容之前(我不知道它为什么存在的上下文)并将其减少到仅0.1sQAR Test 2 的更改代码如下所示:

    #QAR Test 2
    if windll.user32.OpenClipboard(None):
        windll.user32.EmptyClipboard()
        windll.user32.CloseClipboard()
    pyautogui.click(262, 162) # navigates to tab with text box
    pyautogui.click(614, 314) #clicks in text box
    pyautogui.hotkey("Ctrl", "a")
    pyautogui.hotkey("Ctrl", "c")
    time.sleep(0.1)
    background_tm= copy_clipboard()
    print(background_tm)
    print("test1")
    

    注意:如果这仍然不起作用,可能值得研究一种获取剪贴板内容的不同方法,因为许多人(比我更有经验!)报告说它返回 None 而不是实际内容在某些情况下。

    【讨论】:

      【解决方案3】:

      嘿,我想主要原因是您所做的错字: 您使用了“Ctrl”,即大写 C 的 Control,有时由于错误处理机制而被接受,但并非总是如此。试试这个:

      pyautogui.hotkey('ctrl','c')
      

      或者使用热键的后端方法是

      pyautogui.keyDown('ctrl')
      pyautogui.press('c')
      pyautogui.keyUp('ctrl')
      

      在调用它之前使用更多的 sleep() 时间,这可能是因为程序可能运行得更快(或者更慢),安全总比抱歉好。 祝你好运

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 2018-04-14
        • 1970-01-01
        • 1970-01-01
        • 2019-07-18
        • 2011-04-19
        • 1970-01-01
        • 2010-11-17
        • 2011-09-15
        相关资源
        最近更新 更多