2
votes

Problème de copie dans le presse-papiers à l'aide de tkinter et pyautogui

Je travaille sur un programme d'automatisation pour examiner / tester du contenu dans une application tierce. Pour le moment, je vais avec pyautogui pour mettre en évidence et copier les valeurs (au moins jusqu'à ce que nous ayons accès pour interroger la base de données des applications) et tkinter pour récupérer les données du presse-papiers.

Le script ci-dessous a travaillé à la copie du contenu qui peut être mis en évidence sur l'écran (sous la section #get manager dans le script).

Cependant, lorsque je navigue vers une section qui a un corps de texte (#QAR test 2), utilisez pyautogui.hotkey ("Ctrl", "a") pour tout mettre en surbrillance et pyautogui.hotkey ("Ctrl "," c ") à copier, il semble que le presse-papiers ne soit pas rempli (en raison du message d'erreur lors de la tentative d'impression de la variable à laquelle il a été affecté).

Pour référence, je joins une capture d'écran du texte cible. Le texte (en particulier, les paragraphes) ne peut-il pas être copié dans le presse-papiers?

Le message d'erreur généré après le #QAR Test 2 est:

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

entrez la description de l'image ici

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 commentaires

Vous dites "en raison du message d'erreur", mais vous n'avez pas cité le message d'erreur - ne pensez-vous pas que cela pourrait être un détail important? (Je suppose que vous avez juste besoin d'un peu de retard entre l'envoi de Ctrl-C et la vérification du presse-papiers, pour donner à l'autre programme une chance de faire quoi que ce soit.)


Grand point, je mets à jour l'entrée pour inclure le message d'erreur. Merci!


Essayez d'ajouter une très petite pause avant d'essayer d'accéder aux données du presse-papiers car le raccourci clavier n'est pas instantané. Ceci est noté dans un commentaire de code " ctrl-c est généralement très rapide mais votre programme peut s'exécuter plus rapidement " trouvé dans un autre thread SO: stackoverflow.com/a/51505977/7496549 )


3 Réponses :


0
votes

Selon @TerryJanReedy, l'erreur indique qu'il n'y a rien dans le presse-papiers, pas même une chaîne vide.
Essayez donc d'abord d'y ajouter quelque chose.
Essayez:

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 commentaires

0
votes

Comme mentionné dans mon commentaire, le raccourci control-c n'agit pas immédiatement:

Essayez d'ajouter une très petite pause avant d'essayer d'accéder aux données du presse-papiers car le raccourci clavier n'est pas instantané. Ceci est noté dans un commentaire de code "ctrl-c est généralement très rapide mais votre programme peut s'exécuter plus rapidement" trouvé dans un autre fil SO )

Dans cette situation, je déplacerais le sleep vers avant d'obtenir le contenu du presse-papiers (je ne connais pas le contexte pour expliquer pourquoi il est là) et le réduire à juste 0,1 s . Le code modifié pour QAR Test 2 peut être vu ci-dessous:

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

Remarque: si cela ne fonctionne toujours pas, il peut être intéressant de consulter un méthode différente pour obtenir le contenu du presse-papiers car de nombreuses personnes (beaucoup plus expérimentées que moi!) ont signalé qu'il renvoie Aucun au lieu du contenu réel dans certaines situations.


0 commentaires

0
votes

Hé, je suppose que la raison principale est la faute de frappe que vous avez faite: Vous avez utilisé 'Ctrl', c'est-à-dire Contrôle avec C majuscule, ce qui est parfois accepté en raison du mécanisme de gestion des erreurs, mais pas toujours. Essayez ceci:

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

Ou utilisez la méthode backend des raccourcis clavier qui est

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

Et utilisez un peu plus de temps sleep () avant d'appeler ceci , c'est peut-être parce que le programme peut être plus rapide (ou plus lent d'ailleurs), il vaut mieux prévenir que guérir. Bonne chance

J'espère que cela vous aidera


0 commentaires