Seite 1 von 1
pyautogui sendet keinen Tastencode
Verfasst: Dienstag 18. Januar 2022, 14:40
von siekai
Hallo Forum,
ich zeichne mit Inkscape Entwürfe und möchte die Arbeit automatisieren. Dazu habe ich im Programm für eine Funktion die Tastenkombination strg alt p vergeben die ich jetzt mittel pyautogui aufrufen möchte. Das Programm läuft ohne Fehler durch, es passiert allerdings nichts. Das Ganze habe ich ähnlich auch schon mit sendkeys probiert, gleiches Ergebniss. Irgendwas verstehe ich scheinbar generell nicht ?
Code: Alles auswählen
import pyautogui as pag
import win32com.client
import time
shell = win32com.client.Dispatch("WScript.Shell")
shell.AppActivate("Inkscape")
pag.keyDown('f1')
pag.keyUp('f1')
time.sleep (5)
shell.AppActivate("Inkscape")
time.sleep (1)
pag.keyDown('ctrl')
time.sleep (1)
pag.keyDown('alt')
time.sleep (1)
pag.keyDown('p')
time.sleep (1)
pag.keyUp('ctrl')
time.sleep (1)
pag.keyUp('alt')
time.sleep (1)
pag.keyUp('p')
time.sleep (1)
Hier der aktuelle Code. Die Zeile: shell.AppActivate("Inkscape") ist drin weil ich mir dachte, daß ich erst wieder an Inkscape übergeben muss und time.sleep um zu verhindern, dass mein Rechner etwas schluckt.
Die F1 Taste am Anfang soll einfach nur zeigen ob irgendetwas geht, aus Geany heraus macht sich normalerweise das Fenster
"Datei öffnen mit" auf. Wäre schön wenn mir jemand einen Tip geben könnte.
Gruß
siekai
Re: pyautogui sendet keinen Tastencode
Verfasst: Dienstag 18. Januar 2022, 14:42
von __deets__
Waere es nicht einfacher, in Python direkt einfach das gewuenschte SVG zu erzeugen? Das ist ja am Ende auch nur eine XML-Datei, und es gibt ja auch diverse SVG Zeichenbibliotheken.
Re: pyautogui sendet keinen Tastencode
Verfasst: Dienstag 18. Januar 2022, 16:49
von siekai
Hallo deets,
ich bin mir nicht sicher ob meine Frage richtig rüber gekommen ist. Es geht mir darum Shortcut's zu automatisieren.
Im zweiten Step dann sogar vieleicht noch eine Folge davon.
In Python das SVG zu erzeugen hieße ja in Phyton zeichnen ? Dazu wäre meine Entwürfe glaube ich zu umfangreich.
Re: pyautogui sendet keinen Tastencode
Verfasst: Dienstag 18. Januar 2022, 16:51
von __deets__
Deine Frage ist schon richtig ruebergekommen. Nur weiss ja keiner, was du da machst, also haette es eben auch sein koennen, dass diese Form der Automatisierung komplizierter als das erzeugen der SVGs mit Python ist. Warum pyautogui nicht tut, kann ich mangels Nutzung selbst nicht sagen.
Re: pyautogui sendet keinen Tastencode
Verfasst: Mittwoch 19. Januar 2022, 17:53
von siekai
Hallo noch einmal,
hat keiner eine Idee für mich ?
Ein kleines Stück bin ich weitergekommen. Wenn ich Python auf der Konsole starte, pyautogui dort importiere und eine Fxx Taste absende
tut sich etwas. Heißt also, dass das Modul korrekt installiert ist und funktioniert. Wahrscheinlich müsste ich jetzt durch welchen Befehl auch immer
Inkscape aktivieren. "shell.AppActivate("Inkscape")" ist es augenscheinlich nicht. Ich habe viel dazu gelesen, überstieg aber dann doch mein Verständnis.
Hat jemand ein Stichwort für mich wie oder wo ich weitersuchen kann ?
Re: pyautogui sendet keinen Tastencode
Verfasst: Mittwoch 19. Januar 2022, 19:35
von siekai
Und wieder etwas weiter.
shell.AppActivate("Inkscape") war tatsächlich das Problem. Ich habe einen Code gefunden der mir die geöffneten Programme anzeigt.
Code: Alles auswählen
import win32gui
def window_enum_handler(hwnd, resultList):
if win32gui.IsWindowVisible(hwnd) and win32gui.GetWindowText(hwnd) != '':
resultList.append((hwnd, win32gui.GetWindowText(hwnd)))
def get_app_list(handles=[]):
mlst=[]
win32gui.EnumWindows(window_enum_handler, handles)
for handle in handles:
mlst.append(handle)
return mlst
appwindows = get_app_list()
for i in appwindows:
print( i)
Dabei kam raus, das dem Programmname Inkscape das geöffnete Dokument vorangestellt ist.
Der Code sieht jetzt so aus und funktioniert:
Code: Alles auswählen
import pyautogui as pyautogui
import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")
shell.AppActivate("Neues Dokument 2 - Inkscape")
pyautogui.hotkey('ctrl', 'alt', 'p',interval=0)
Jetzt ist das Ganze aber nicht mehr universell, ich müsste jedes Mal erst den korrekten Namen für AppActivate ermitteln und eintragen.
Hat dazu jemand einen Tip wo und wie ich weitermachen kann ? Ginge das irgendwie mit einer Wildcard "*Inkscape" ?
Re: pyautogui sendet keinen Tastencode
Verfasst: Donnerstag 20. Januar 2022, 12:51
von siekai
Geschafft!
Für die die irgendwann das gleiche oder ein ähnliches Thema haben hier (meine) Lösung.
Hintergrund ist das ich mit dem Code zum Auflisten der geöffneten Programme ( siehe oben ) den korrekten Dateinamen ja schon in einer Liste habe.
Ich durchsuche sie in welcher Zeile "....Inkscape " auftaucht und kopiere mir dann den gesamten Eintrag. Damit geht es dann weiter zum aktivieren der Anwendung
und Shortcut absetzen.
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 13 17:10:47 2022
@author: siekai
"""
#!/usr/bin/env python
import pyautogui as pyautogui
import win32com.client
import win32gui
def window_enum_handler(hwnd, resultList):
if win32gui.IsWindowVisible(hwnd) and win32gui.GetWindowText(hwnd) != '':
resultList.append((hwnd, win32gui.GetWindowText(hwnd)))
def get_app_list(handles=[]):
mlst=[]
win32gui.EnumWindows(window_enum_handler, handles)
for handle in handles:
mlst.append(handle)
return mlst
# Liste der geöffneten Anwendungen holen und auf ....Inkscape untersuchen
appwindows = get_app_list()
for i in appwindows: # Listenzeilen durchgehen
j = (i[1].find("Inkscape")) # Listenzeile durchsuchen ob Inkscape auftaucht
if j > 2: # Wenn gefunden mitnehmen für .AppActivate
Dateiname = i[1]
# Mit dem korrekten Eintrag aus der Liste Programm in den Vordergrund holen
shell = win32com.client.Dispatch("WScript.Shell")
shell.AppActivate(Dateiname)
# Inkscape steuern
pyautogui.hotkey('alt','space', 'x',interval=0) # Fenster maximieren
pyautogui.hotkey('ctrl', 'alt', 'p',interval=0) # Shortkey absetzen
Falls Namenskonventionen etc. nicht Python konform sind bitte ich um Entschuldigung.
Da arbeite ich noch dran.
Re: pyautogui sendet keinen Tastencode
Verfasst: Donnerstag 20. Januar 2022, 14:42
von __blackjack__
@siekai: Blöde Frage: Inkscape *selbst* kann man doch in Python skripten. Muss man da wirklich über solche externen Wege gehen?
Re: pyautogui sendet keinen Tastencode
Verfasst: Donnerstag 20. Januar 2022, 14:52
von siekai
Hallo blackjack
ja ist so, und wäre auch mit Abstand smarter. Ich habe versucht mich da einzulesen.
Würde ich total gerne beisteuern um auch etwas für das Projekt zu tun. Ist aber
im Moment einfach noch zu hoch gegriffen.