Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Toolkit für prinzipiell ganz einfaches Programm
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2538
Location: Konradsreuth (Germany)

PostPosted: Mon Nov 12, 2012 7:19 pm    Post subject: Toolkit für prinzipiell ganz einfaches Programm Reply with quote

Hallo allerseits :-)

Ich will ein augenscheinlich einfaches Problem lösen, weiß nur mangels vorhandener Erfahrung in GUI-Programmierung nicht wie und wäre für jede Hilfe dankbar! Folgendes will ich machen:

Ich brauche ein Fenster, was entweder transparent ist oder gerne auch pseudo-transparent, heißt, einfach einen Screenshot des Bereichs macht, der hinter dem Fenster wäre, wenn es nicht da wäre. Und dann will ich mittels einer Linie, die durch mehrere Punkte definiert ist, einen Bereich markieren können.

Das war’s schon. Problem ist nur, dass das Ganze auch unter Windows XP laufen muss. Verwenden würde ich gerne Python (am liebsten Python 3) dafür, weil ich das einigermaßen kann. Nur was für ein Toolkit nimmt man? Qt? GTK?

Sinn des Programms soll sein, dass ich erst mit einer Linie ein Objekt bekannter Länge markiere, dann ausrechne, wie viele Pixel lang die Linie ist, und somit per Dreisatz dann ein anderes Objekt unbekannter Länge mittels einer weiteren Linie vermessen kann.

Kann mir jemand einen Tip geben, wo ich damit anfangen könnte? Vielen Dank schonmal!
Back to top
View user's profile Send private message
Finswimmer
Bodhisattva
Bodhisattva


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Mon Nov 12, 2012 8:34 pm    Post subject: Reply with quote

Evtl kannst du das auch ohne GUI machen?
Du könntest in einer cmd/shell anzeigen lassen:
Punkt 1 anklicken
Punkt 2 anklicken
usw.
Mit Enter beenden

Bei jedem Mausklick lässt du dir die Koordinate der Mausposition ausgeben und berechnest damit die Distanz.
Das Ganze sieht dann evtl. unschön aus, aber ist dafür ohne großen Aufwand machbar.

http://www.daniweb.com/software-development/python/code/230886/get-the-mouse-position-on-the-screen-on-linux#
http://stackoverflow.com/questions/3698635/geting-cursor-position-in-python
_________________
Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2538
Location: Konradsreuth (Germany)

PostPosted: Mon Nov 12, 2012 8:52 pm    Post subject: Reply with quote

Die Striche müsste ich schon sehen können, um sicher zu sein, dass ich auch richtig kalibriert/gemessen habe …
Back to top
View user's profile Send private message
firefly
Watchman
Watchman


Joined: 31 Oct 2002
Posts: 5161

PostPosted: Tue Nov 13, 2012 7:17 am    Post subject: Reply with quote

Mit pseudo transparenz würdest du nicht weit kommen. Denn AFAIK kann ein Programm nur den "Desktop" Hintergrund bekommen welches sich unterm dem Breich befindet wo sich das Fenster befindet. (Wobei das nur für den X-Server gilt)
Und für echte Transparents benötigst du unter linux mit einem X-Server einen laufenden composite manager.

Du könntest aber einfach mit einem (externen) Programm einen Screenshot von der entsprechende Stelle machen.
Und dann das Bild in deinem Programm laden und anzeigen.
_________________
Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2538
Location: Konradsreuth (Germany)

PostPosted: Tue Nov 13, 2012 11:14 am    Post subject: Reply with quote

Einen Screenshot zu machen ist kein Problem. Das hab ich schon mit Qt und GTK gemacht, man müsste ja bloß die Koordinaten des Fensters wissen, dann das Fenster Ausblenden, einen Desktop-Screenshot mit dem passenden Ausschnitt machen und gut.

Echt Transparenz wäre hier denke ich übertrieben, weil ich die eigentlich nicht brauche, sondern nur ein statisches Bild. Und das wird denke ich auch ein Problem unter Windows XP sein, oder?
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2538
Location: Konradsreuth (Germany)

PostPosted: Fri Nov 16, 2012 1:36 pm    Post subject: Reply with quote

Update: ich hab’s mit Python 3.3 und PyQt4 gemacht. War deutlich einfacher als gedacht – und läuft 1:1 genauso unter Windows. Einwandfrei :-)
Back to top
View user's profile Send private message
cryptosteve
Veteran
Veteran


Joined: 04 Jan 2004
Posts: 1169
Location: GER

PostPosted: Fri Nov 16, 2012 2:39 pm    Post subject: Reply with quote

Zeigen! :)
_________________
- born to create drama -
gpg: 0x9B6C7E15
CS Virtual Travel Bug: VF6G5D
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2538
Location: Konradsreuth (Germany)

PostPosted: Fri Nov 16, 2012 4:47 pm    Post subject: Reply with quote

Nicht hauen, ist mein allererstes Programm mit GUI ;-)

Ist unter svn://l3u.de/nasauber.de/trunk/endomess zu finden.
endomess.ui muss noch mittels pyuic4-3.2 in Python-Code übersetzt werden, und zwar nach endomess_ui.py.

Kurz und knapp also:
Code:
svn export svn://l3u.de/nasauber.de/trunk/endomess && cd endomess && pyuic4-3.2 endomess.ui > endomess_ui.py


„Load“ macht einen Screenshot, danach wird automatisch der Knopf „Calibrate“ geklickt. Eine Linie markiert man mit Linksklicks, Beendet wird die Linienerstellung mit einem Rechtsklick. Nach dem Kalibrieren das mm-Maß des markierten Objekts eingeben und „OK“ klicken. Dann wird automatisch der „Measure“-Knopf geklickt. Danach kann man was messen, die Linie wird wie beim Kalibrieren erstellt.

Was sicher nicht ganz „sauber“ ist: das sleep(0.3) in getScreenshot() – aber ansonsten war das Fenster selber auf dem Screenshot. Und habe auf Anhieb auch keine Möglichkeit gefunden, wie ich herausfinden kann, wann das Fenster wirklich ausgeblendet ist.
Back to top
View user's profile Send private message
franzf
Advocate
Advocate


Joined: 29 Mar 2005
Posts: 4565

PostPosted: Sat Nov 17, 2012 6:36 pm    Post subject: Reply with quote

sleep unterbricht einfach die Ausführung. Dass es funktioniert kann ich mir nur dadurch erklären, dass im Hintergrund X asynchron noch arbeitet.
Sauber wäre es, das Pixmap holen + anschließendem show() in einen separaten SLOT zu legen und diesen direkt nach dem hide() per QTimer.singleshot() aufzurufen. Damit der User sieht, dass gerade gearbeitet wird, kannst du noch Qt.WaitCursor als overrideCursor setzen (->QApplication) und vor dem show() natürlich restoreOverrideCursor nicht vergessen :)
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2538
Location: Konradsreuth (Germany)

PostPosted: Sun Nov 18, 2012 6:46 pm    Post subject: Reply with quote

Sorry, ist nicht nur mein erstes Programm mit GUI, sondern auch mein erstes Qt-Programm …

Das sind doch bestimmt nur ein paar Zeilen Code, oder? Würdest du mir verraten, welche? ;-)

Ich hab nicht rausfinden können, wie ich herausbekomme, wann das Fenster tatsächlich weg ist. Das hide() allein ist jedenfalls viel zu schnell, wie gesagt: ohne sleep() ist das Fenster selbst auf dem Screenshot drauf.
Back to top
View user's profile Send private message
franzf
Advocate
Advocate


Joined: 29 Mar 2005
Posts: 4565

PostPosted: Mon Nov 19, 2012 11:32 am    Post subject: Reply with quote

Ich meinte auch gar nicht, dass du das herausfinden sollst. Nur das sleep durch QTimer ersetzen:
Code:
--- endomess.py.org     2012-11-19 14:08:56.283706491 +0100
+++ endomess.py 2012-11-19 14:11:13.701697217 +0100
@@ -33,8 +33,9 @@
                self.delItems(self.screenshot.pixmapType)
 
                self.hide()
-               sleep(0.3)
-
+               QTimer.singleShot(300, self.doGetAndShow)
+
+       def doGetAndShow(self):
                screenshotPic = QGraphicsPixmapItem(QPixmap.grabWindow(
                        QApplication.desktop().winId(),
                        x = self.geometry().x(),

Wenn du dann nach dem hide() ein
Code:
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))

Und vor dem show in doGetAndSow
Code:
QApplication.restoreOverrideCursor()

Ob die 300ms ausreichen hängt übrigens vom System des Benutzers und deren Auslastung ab (normalerweise sollte es aber locker reichen).

Ich muss jetzt aber noch hinterherschieben, dass ich das gerade nicht testen kann, da der Rechner an dem ich gerade sitze kein PyQt4 installiert hat... Wenn es NICHT klappt einfach nochmal melden :)
machst, weiß der User auch was los ist.
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2538
Location: Konradsreuth (Germany)

PostPosted: Mon Nov 19, 2012 1:33 pm    Post subject: Reply with quote

Es geht so, aber interessanterweise erscheint das Fenster hinterher nicht an der selben Stelle, sondern immer im rechten oberen Eck des Bildschirms. Der Screenshot passt aber … vorher ist es zumindest ungefähr wieder da erschienen, wo es vorher war, nur ein Bisschen (um die Höhe der Fensterleiste?) nach unten versetzt.

Interessant wäre an dieser Stelle sicher, den Screenshot pixelgenau machen zu können und das Fenster auch exakt da wieder erscheinen zu lassen, wo es vorher war. Mir ist ohnehin nicht ganz klar, warum das Fenster (bei beiden Varianten) nach dem show() woanders auftaucht, als es vorher war.
Back to top
View user's profile Send private message
AmonAmarth
l33t
l33t


Joined: 03 Mar 2005
Posts: 727

PostPosted: Mon Nov 19, 2012 9:51 pm    Post subject: Reply with quote

l3u wrote:
Es geht so, aber interessanterweise erscheint das Fenster hinterher nicht an der selben Stelle, sondern immer im rechten oberen Eck des Bildschirms. Der Screenshot passt aber … vorher ist es zumindest ungefähr wieder da erschienen, wo es vorher war, nur ein Bisschen (um die Höhe der Fensterleiste?) nach unten versetzt.

Interessant wäre an dieser Stelle sicher, den Screenshot pixelgenau machen zu können und das Fenster auch exakt da wieder erscheinen zu lassen, wo es vorher war. Mir ist ohnehin nicht ganz klar, warum das Fenster (bei beiden Varianten) nach dem show() woanders auftaucht, als es vorher war.


speicher die fensterposition vor dem hide ab und setze sie nach dem show weider dort hin. wahrscheinlich ordnet der fenstermanager die fenster neu an.
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2538
Location: Konradsreuth (Germany)

PostPosted: Tue Nov 20, 2012 12:18 pm    Post subject: Reply with quote

Hab ich schon ausprobiert, ändert aber nichts – getestet mit gespeicherten Werten von geometry() und frameGeometry() und einem setGeometry() hinterher.
Back to top
View user's profile Send private message
py-ro
Veteran
Veteran


Joined: 24 Sep 2002
Posts: 1734
Location: Velbert

PostPosted: Tue Nov 20, 2012 12:22 pm    Post subject: Reply with quote

Wozu Überhaupt der Screenshot, theoretisch müsstest auch einfach direkt auf den Bildschirm malen können, statt eines Fensters ein leeres Widget verwenden und darauf zeichnen.

Aber ich hab das selber noch nicht ausprobiert.

Bye
Py
Back to top
View user's profile Send private message
firefly
Watchman
Watchman


Joined: 31 Oct 2002
Posts: 5161

PostPosted: Tue Nov 20, 2012 6:45 pm    Post subject: Reply with quote

py-ro wrote:
Wozu Überhaupt der Screenshot, theoretisch müsstest auch einfach direkt auf den Bildschirm malen können, statt eines Fensters ein leeres Widget verwenden und darauf zeichnen.

Aber ich hab das selber noch nicht ausprobiert.

Bye
Py

Wie stellst du dir ein "leeres WIdget" vor? Etwa voll Transparenz aber trotzdem mit fenster rahmen?.
Wenn ja, dann geht das unter linux/X11 nur indem eine Mask verwendet wird, welche angibt welche stellen des fensters gezeichnet werden soll oder nicht.
Wie es aber unter windows aussieht weis ich nicht, vermutlich ähnliches.
Ansonsten ist unter linux für "echte" Transparenz nur im zusammenspiel mit einem compositing manager (z.b. compiz) möglich
_________________
Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2538
Location: Konradsreuth (Germany)

PostPosted: Tue Nov 20, 2012 6:46 pm    Post subject: Reply with quote

Funktioniert dann allenfalls mit echter Transparenz, weil ein leeres Widget dann trotzdem auf dem opaken Fenster angezeigt wird. Und dann sieht man halt das leere Fenster. Aber generell ist das mit dem Screenshot gut, weil man dann auch das Fenster verschieben kann, ohne dass die Zeichnung nicht mehr zum Bild passt.

Edit: … und außerdem das, was firefly (gleichzeitig mit mir) gepostet hat ;-)
Back to top
View user's profile Send private message
py-ro
Veteran
Veteran


Joined: 24 Sep 2002
Posts: 1734
Location: Velbert

PostPosted: Tue Nov 20, 2012 6:52 pm    Post subject: Reply with quote

Ich vergaß das xorg ja noch Steinzeit in manchen belangen ist. :evil:
Back to top
View user's profile Send private message
firefly
Watchman
Watchman


Joined: 31 Oct 2002
Posts: 5161

PostPosted: Tue Nov 20, 2012 7:48 pm    Post subject: Reply with quote

py-ro wrote:
Ich vergaß das xorg ja noch Steinzeit in manchen belangen ist. :evil:

Im vergleich zu Windows ist das aktuelle xorg auf gleicher technischer höhe, was die echte transparenz von fenstern betrifft. Nur halt muss ein composite manager laufen.
In windows ist dieser manager halt schon seit mindestens Windows XP fester bestandteil des "fenster"/Graphik systems.
_________________
Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum