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

时间:2019-03-13 14:31:49

标签: python tkinter pycharm pyautogui

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

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

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

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

#QAR测试2之后引发的错误消息是:

HKEY_CURRENT_USER\Software\Microsoft\Office\<version>.0\Outlook\Security

enter image description here

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

3 个答案:

答案 0 :(得分:0)

根据@TerryJanReedy,该错误表明剪贴板中什么也没有,甚至没有空字符串。
因此,请先尝试在其中添加一些内容。
试试:

# View
if parent_success_obj.uid:            
    serializer_obj = ProviderStatusSerilaizer(
        data = data,
        context = {
            'provider_id': parent_success_obj.uid,
            'provider_status': status
        }
    )

# Serializer

class ProviderStatusSerilaizer(serializers.ModelSerializer):
    class Meta:
        model = ProviderStatus
        fields= ('uid','created_by','remark','effective_date_from','effective_date_to',)  # I am removing provider_id and provider_status as I will be injecting this data separately

    def create(self, validated_data):
        validated_data.update(self.context) # updating validated data dictionary with context dictionary
        return super().create(validated_data)

答案 1 :(得分:0)

正如我的评论中所述,control-c快捷键不会立即起作用:

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

在这种情况下,我将import {faCoffee} from "@fortawesome/free-solid-svg-icons"; <FontAwesomeIcon icon={faCoffee} /> 移动到剪贴板内容之前(我不知道它为什么存在的上下文),并将其简化为sleep0.1s更改后的代码如下所示:

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") 而不是返回在某些情况下的实际内容。

答案 2 :(得分:0)

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

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

或使用热键的后端方法

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

并在调用此函数之前使用更多的sleep()时间,这可能是因为该程序可能运行得更快(或对此而言运行得更慢),其安全性胜过遗憾。 祝你好运

希望这会有所帮助