pyautogui sendet keinen Tastencode

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
siekai
User
Beiträge: 6
Registriert: Montag 17. Januar 2022, 20:51

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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
siekai
User
Beiträge: 6
Registriert: Montag 17. Januar 2022, 20:51

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.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
siekai
User
Beiträge: 6
Registriert: Montag 17. Januar 2022, 20:51

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 ?
siekai
User
Beiträge: 6
Registriert: Montag 17. Januar 2022, 20:51

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" ?
siekai
User
Beiträge: 6
Registriert: Montag 17. Januar 2022, 20:51

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@siekai: Blöde Frage: Inkscape *selbst* kann man doch in Python skripten. Muss man da wirklich über solche externen Wege gehen?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
siekai
User
Beiträge: 6
Registriert: Montag 17. Januar 2022, 20:51

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.
Antworten