Gedankenfurz

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
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

ahoi,
da ich in Bälde mal wieder eine Dokumentation machen muß, mit Bildchen und Text, Pfeilen, Kreisen usw., frage ich mich gerade, ob es eine *einfache* Möglichkeit gibt, das MS Snipping-Tool und MS Paint zu kombinieren, d.h. ich möchte mir das lästige kopieren des Bildes vom Snipping-Tool und das Einfügen des Bildes in MS Paint gerne ersparen. Die Software *Snag-it* hat ein tolles Feature, das nach dem ziehen des Rahmens um den entsprechenden Ausschnitt, dessen Inhalt sofort in den Editor lädt, mit dem man dann den Ausschnitt (Screenshot) bearbeiten kann. Allerdings ist es mir zu teuer und der Editor ist bei Weitem nicht so gut wie MS Paint, das sich in den letzten Jahren diesbezüglich gemausert hat. Gut, mit Snag-it kann man auch Videos aufzeichnen, aber das brauche ich nicht. Ich brauche auch keine Tipps über (kostenfreie) Software, da ich ja schließlich meine Python-Kenntnisse/-Fähigkeiten erweitern möchte.
Kann man das mit Python machen, oder müßte man dazu im Code vom Snipping-Tool und MS Paint *rumfuschen*, was (wohl) sowieso nicht gehen wird ?
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ggf kannst du das mit pyAutoit automatisieren.
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ _deets_ :
ich habe mir mal schnell die Doku durchgelesen. Hm, ist ja in der Handhabung so *ähnlich* wie die turtle. Ich müßte die Maus aber schon per Hand bedienen können, da ich vom Screen nur einen bestimmten Bereich benötige (Rahmen ziehen, Inhalt des Rahmens ist dann im Snipping-Tool-Fenster - das macht Snipping-Tool ja von alleine.).
Dies per Pixel-Koordinaten anzugeben scheint mir keine Erleichterung zu sein. Dieses Modul (?) simuliert ja *nur* die Maus ... Dann kopiere ich lieber das Bild von Snipping-Tool ins Paint ... gut, das Snipping-Tool könnte immer an der selben Stelle des Screens platziert sein, um das Klicken auf die Menü-Buttons zum Kopieren in die Zwischenablage und zum Einfügen nach Paint zu übernehmen, aber das würde auch länger dauern, und ich müßte zudem noch die Konsole geöffnet haben ...
ich brauche *nur* eine Methode, die automatisch den von mir mit Snipping-Tool umrandeten Bildausschnitt ins Paint-Fenster kopiert. Ob Paint vorher offen ist oder erst mit dem Kopieren zum Einfügen geöffnet wird, ist mir dabei wurscht.
Und danke für den Tipp, so lerne ich peu à peu auch die verschiedensten Module von Python kennen :-)

EDIT:
ich bin ja auch ein Dussel; habe soeben in den Einstellungen von Snipping-Tool gesehen, dass der Ausschnitt auch zusätzlich in die Zwischenablage kopiert werden kann :-)
dann Paint (mit der Voreinstellung: Bildbereich = 1x1 px) aus der Taskleiste vergrößern, STRG+V und Bild mit Text, Kreisen, Pfeilen, etc. bearbeiten, fertisch !
Kommt davon, wenn man einen Gedankenfurz hat :roll:
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
randomuser
User
Beiträge: 9
Registriert: Donnerstag 21. Februar 2019, 09:58

Verwende doch pyautogui.
- Screenshot machen (region oder komplette Bildschirm) via Python
- Bild mit eingestellten Namen an gewünschten Ort speichern
- Bild öffnen in Paint (müsste gehen via subprocess, kann es gerade nicht testen)
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ randomuser:
danke für deine Antwort. Werde ich mal die Doku lesen. Vorab aber die Frage zur Reihenfolge und Handhabung, die ich aus verschiedensten Gründen derart einhalten möchte/muss, und dazu die Frage, ob dies machbar ist :
1. Sreenshot (Ausschnitt oder komplett)
2. in Paint automatisch kopieren, das sich auch gerne automatisch öffnen kann/sollte.
3. Bild bearbeiten
4. Bild (automatisch?) mit fortlaufende(m/r) (Namen und) Nummer durch einen Mausklick in einem Verzeichnis speichern.
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
randomuser
User
Beiträge: 9
Registriert: Donnerstag 21. Februar 2019, 09:58

1) geht

2-4) Warum Paint? Die Bilder kannst du nachher nicht mehr ändern, alle Änderungen sind eingebrannt. Ich würde für diese Schritte Inkscape vorschlagen. Fertiges Bild als SVG speichern und daraus PNGs generieren. Wenn dann doch mal ein Pfeil oder Kreis (die sich 1000000x leichter erstellen lassen in Inkscape) geändert werden soll dann einfach SVG öffnen, Änderungen vornehmen und wieder PNG exportieren.

Inkscape lässt sich auch scripten/erweitern... mit Python :-D
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

-----------------------
EDIT:
zu 1. händisch? also ich führe die Maus selbst, keine Eingabe von Koordinaten.
-----------------------

danke dir für deine Antwort(en). Ich schau's mir mal an ...
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

war für's EDIT zu spät:

1. händisch/manuell per Maus die Auswahl (Rechteck) für Screenshot ziehen und danach startet das Skript (oder bereits vorher) automatisch, und ich kann (habe ich so aus der Doku verstanden) den Ausschnitt in beispielsweise geöffnete Apps (oder diese per Code [beispielsweise Mausklick- Koordinatenangabe, etc.] öffnen und reinkopieren) und dann händisch wieder bearbeiten ?
Mir geht es um das Zusammenspiel zwischen händischen/manuellen *Operationen* und Skript-Aktivitäten, ohne Angabe von Zeiten/Pausen, etc.
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
randomuser
User
Beiträge: 9
Registriert: Donnerstag 21. Februar 2019, 09:58

Perlchamp hat geschrieben: Samstag 23. Februar 2019, 00:11 1. händisch/manuell per Maus die Auswahl (Rechteck) für Screenshot ziehen
Das geht nicht - man muss die Koordinaten eingeben. pyautogui kann mouse events nicht "detektieren", lediglich simulieren.

Dann doch eher Snipping Tool oder was anderes. Alternativ pyautogui und immer kompletten Bildschirm abspeichern und erst in Inkscape zuschneiden (maskieren eigentlich). Hätte den Vorteil das man immer alles hat, sofern man nachträglich doch eine andere Region haben will.
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@randomuser:
danke für deine Tipps. Ich habe jetzt mal alles soweit ausprobiert. Es paßt einfach nicht. Inkscape (viel zu langsam dazu) hat nicht das, was ich brauche, pyautogui macht nicht das, was ich will oder liefert nicht immer das gleiche Ergebnis. Ich versuche es jetzt mal anders, mal schauen, ob und wie es funzt ...
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

moinsen,
ich habe mich entschieden, mal zu probieren, ob ich nicht ein kleines GUI-basiertes Programm u.a. mit Tkinter schreiben kann. Ich habe mich auch etwas eingelesen, mir verschiedene Dokus angeschaut, und habe dennoch ein paar Fragen.
Pillow and PIL cannot co-exist in the same environment. Before installing Pillow, please uninstall PIL.
Pillow >= 1.0 no longer supports “import Image”. Please use “from PIL import Image” instead.
Pillow >= 2.1.0 no longer supports “import _imaging”. Please use “from PIL.Image import core as _imaging” instead.
1. wie deinstalliere ich PIL (mit pip) ? Aktuelle Version auf Python 3.7 => 1.1.7
2. wenn PIL deinstalliert ist, wie soll ich dann “from PIL import Image” und “from PIL.Image import core as _imaging” benutzen ?

Meine Idee:
mittels Python MSS einen Screenshot machen und dann mittels crop() von pillow einen Bereich (Rechteck) ausschneiden durch Klicken und Ziehen mit der Maus (=> ist das machbar ?) oder durch Klicken [x-top-left] (get x,y Koordinaten), Rahmen wird gezogen und erneutes Klicken [y-bottom-right] (get x,y Koordinaten) => ist das machbar (und bitte nicht: 'alls ist machbar') ... oder andere Ideen vorhanden ?
Danach mit Canvas ein paar Formen zum Zeichnen anbieten, mit Farbwahl, (un)ausgefüllt, etc.
Ich habe bereits viel gelesen, aber nicht, ob man einen Bildausschnitt mittels Mausziehen auswählen und dadurch beschneiden kann. Vielleicht weiß dies jemand hier. Ich suche auf jeden Fall weiter ...
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Perlchamp: Ad 2. Wenn PIL deinstalliert ist, dann installierst Du ja Pillow. Und dann machst Du das einfach genau so wie es da steht: ``from PIL import Image``. Das zweite würde ich eher nicht machen wollen, denn das sieht nach einem internen Modul aus.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ _blackjack_ :
bis jetzt weiß ich ja noch nicht einmal, WIE in PIL deinstallieren kann, UND:
danke für den Tipp mit dem internen Modul
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Perlchamp: Wie deinstallieren hängt ja auch davon ab wie es überhaupt installiert wurde. Wenn es mit ``pip`` installiert wurde, kann man es auch damit wieder deinstallieren. Wenn es mit der Paketverwaltung einer Linux-Distribution auf den Rechner kam, braucht man es nicht deinstallieren, sondern kann einfach Pillow mit ``pip`` installieren. Oder man verwendet sowieso „virtual environments“ (virtualenv/venv/pipenv/…), dann ist das gar keine Frage die sich stellt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@_blackjack_ :
ich meine, es kam mit Python 3.7, bin mir leider aber nicht mehr sicher. Wenn nicht, dann habe ich es mit pip installiert, und werde es dann damit auch wieder deinstallieren, danke.
Ist ein (virtualenv/venv/pipenv/…) so etwas wie eine Sandbox? (Ich habe jetzt schnell gefragt, ohne darüber nachzulesen. Werde ich mal tun ...)
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Perlchamp: Ja das ist eine Art Sandbox.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

ahoi !
ich bin bereits einen Tag am Suchen, finde aber leider nichts.

Code: Alles auswählen

SYSTEM_PATH = 'c:/windows/system32/'

def btn_snip_clicked():
   shell = win32com.client.Dispatch("WScript.Shell")
   app_snip = shell.Run(f'{SYSTEM_PATH}SnippingTool.exe')
   win32api.Sleep(300)
   shell.AppActivate(f'{SYSTEM_PATH}SnippingTool.exe')
   win32api.Sleep(300)
   shell.SendKeys("^n")
   win32api.Sleep(300)
Wie kann ich SnippingTool.exe wieder beenden ?
Bishereige Versuche u.a.:
app_snip.kill()
app_snip.terminate()
shell.kill()
shell.terminate()
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

salve,
ich hänge fest. Jemand eine Idee für mich ?
Im Voraus besten Dank !
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Programmieren ist halt nicht raten. Hast Du geschaut, was der Rückgabewert von Run ist?
Dann ist ziemlich schnell klar, dass `app_snip` weder eine kill noch eine terminate Methode hat (was auch die Fehlermeldung sagen würde).

Warum benutzt Du überhaupt direkt Windows-Funktionen, wenn auch einfache Pythonvarianten gibt, wie time.sleep oder subprocess.Popen?
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ Sirius3:
danke für deine schnelle Antwort :-)
1.
Natürlich habe ich festgestellt (durch die Fehlermeldungen - ich kann ja lesen), dass *app_snip* diese Methoden nicht kennt. Ich hatte meine *Versuche* deswegen aufgeführt, dass ihr nicht denkt, ich würde hier 'Däumchen drehen' und darauf warten, bis mir jemand eine Lösung präsentiert ... und im Netz habe ich bisher keine Lösung gefunden, und bin noch am lesen/recherchieren ...
2.
time_sleep und subprocess bringen mich insofern nicht weiter, weil ich bisher keine Lösung des eigentlichen Problems gefunden habe:
zeitweise automatische Steuerung von Programmen via Tastatur (Übergabe von Tastendruck-Events) und Maus (MouseDown, MouseUp, rechte, linke Taste, etc.)
ich habe was gefunden, das mich mit der Maus weiterbringt, guckst du:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''detecting_mouseclicks_in_windows_using_python.py:
Code to check if left or right mouse buttons were pressed
  '''

__author__ = 'Markacho'
__date__ = '30.01.2017'


import win32api
import time

state_left = win32api.GetKeyState(0x01)  # Left button down = 0 or 1. Button up = -127 or -128
state_right = win32api.GetKeyState(0x02)  # Right button down = 0 or 1. Button up = -127 or -128

while True:
    a = win32api.GetKeyState(0x01)
    b = win32api.GetKeyState(0x02)

    if a != state_left:  # Button state changed
        state_left = a
        print(a)
        if a < 0:
            print('Left Button Pressed')
        else:
            print('Left Button Released')
            break

    if b != state_right:  # Button state changed
        state_right = b
        print(b)
        if b < 0:
            print('Right Button Pressed')
        else:
            print('Right Button Released')
            break

    time.sleep(0.001)
die *break*s habe ich gesetzt, weil ich nur einen Durchgang der Schleife haben möchte (dann brauche ich auch time.sleep nicht, ich weiß) ...
wenn das auch nur mit Python-Mitteln geht, wäre ich der letzte, der dies ablehnen würde, da es dann nicht windows-proprietär wäre ...
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Antworten