使用tkinter和pyautogui复制到剪贴板的问题

3
我正在开发一个自动化程序,用于审查/测试第三方应用程序中的内容。目前我使用pyautogui来突出显示和复制值(至少在我们能够访问查询应用程序数据库之前),并使用tkinter从剪贴板检索数据。
以下脚本已成功复制可以在屏幕上突出显示的内容(在脚本的#get manager部分下)。
但是,当我导航到具有文本正文(#QAR test 2)的部分时,使用pyautogui.hotkey("Ctrl","a")来突出显示所有内容,并使用pyautogui.hotkey("Ctrl","c")来复制,似乎剪贴板没有填充(由于尝试打印分配给它的变量时出现的错误消息)。
供参考,我附上了目标文本的屏幕截图。文本(特别是段落)不能复制到剪贴板吗?
#QAR Test 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

enter image description here

...
#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")

1
你说“由于错误消息”,但没有引用错误消息 - 你不觉得这可能是一个重要的细节吗?(我怀疑你只需要在发送Ctrl-C和检查剪贴板之间稍微延迟一下,给其他程序有机会实际执行任何操作。) - undefined
太好了,我正在更新条目以包含错误信息。谢谢! - undefined
在尝试访问剪贴板数据之前,尝试添加一个非常小的暂停,因为键盘快捷键不是瞬间完成的。这在另一个SO线程中的代码注释中有所提及:“ctrl-c通常非常快,但您的程序可能执行得更快”(链接:https://dev59.com/hFUK5IYBdhLWcg3wohSK#51505977)。 - undefined
3个回答

1

如我在评论中提到的那样,控制键盘快捷方式并不会立即生效:

尝试在尝试访问剪贴板数据之前添加一个非常小的暂停,因为键盘快捷方式并不是瞬间完成的。这在代码注释中有所提及:“ctrl-c通常非常快,但您的程序可能执行得更快”(在另一个SO thread中找到)

在这种情况下,我建议将 sleep 移动到获取剪贴板内容之前(我不知道它为什么在那里),并将其缩短为只有 0.1秒。修改后的 QAR 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而不是实际内容。

0
根据 @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

0
嘿,我猜主要原因是你犯了个拼写错误: 你使用了大写的'C',也就是Control键,这在某些情况下可能会被接受,因为有错误处理机制,但并不总是有效。试试这个方法:
pyautogui.hotkey('ctrl','c')

或者使用后端的快捷键方法,它是...
pyautogui.keyDown('ctrl')
pyautogui.press('c')
pyautogui.keyUp('ctrl')

在调用这个之前,再使用一些sleep()时间,可能是因为程序运行得更快(或者更慢),最好保险起见。 祝你好运。
希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接