Mausposition

Code-Stücke können hier veröffentlicht werden.
Antworten
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo!
Hab herausgefunden, wie man die Mauszeigerposition unter PyGTK herausfinden kann. Das habe ich mal portiert und so siehts aus:

Code: Alles auswählen

import gtk

w = gtk.Window()
w.set_default_size(300, 100)

lb = gtk.Label("Please, show me the mouse position!")
w.add(lb)

def motion_notify(widget, event):
    text = "Mouse position is: x=%d y=%d" % (event.x, event.y)
    lb.set_text(text)

w.add_events(gtk.gdk.MOTION_NOTIFY | gtk.gdk.BUTTON_PRESS)

w.connect("motion_notify_event", motion_notify)
w.connect("destroy", gtk.main_quit)

w.show_all()
gtk.main()
Viel Spaß, vielleicht finde ich auch noch Lösungen für andere Toolkits :)
Zuletzt geändert von Leonidas am Sonntag 12. Juni 2005, 12:46, insgesamt 2-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Okay, auch für Tkinter noch eine Lösung, als Abwandlung des Beispiels:

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()

def callback(event):
    print "mousecursor at", event.x, event.y 

frame = tk.Frame(root, width=100, height=100)
frame.bind("<Motion>", callback)
frame.pack()

root.mainloop()
Ob ich noch mehr finde?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ja, in pygame geht das auch:

Code: Alles auswählen

import pygame
import pygame.locals as pyl

pygame.init()
screen = pygame.display.set_mode((680, 480))
clock = pygame.time.Clock()

running = True
while running:
    clock.tick(60)

    # handle events
    for event in pygame.event.get():
        if event.type == pyl.QUIT or event.type == pyl.KEYDOWN:
            running = False
        elif event.type == pyl.MOUSEMOTION:
            print "mousecursor at", event.pos[0], event.pos[1]
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Toll :)

Hab grad ein wenig herumgespielt, und bin draufgekommen, daß man bei Tkinter mit winfo_pointerxy() die Position des Mauszeigers am Bildschirm (also nicht nur in der GUI) abfragen kann. Keine Ahnung ob man das mal brauchen kann, aber auch sinnloses Wissen ist Wissen :D

Gruß, mawe
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ja, das ist auch sehr nützlich. Ich weiß jetzt grad nicht wie man das mit anderen Toolkits macht, mit PyGTK sollte es möglich sein, mit pygame eher nicht, da für pygame kaum etwas außer dem eigenen Fenster existiert (wenn man aber auf Vollbild schaltet, sind die Werte es insofern auch wieder in Ordnung). So, nun werde ich mal nach einer GTK Lösung suchen :)
Zuletzt geändert von Leonidas am Freitag 10. Juni 2005, 22:00, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das Herusfinden der Absoluten Koordinaten geht auch mit PyGTK, indem man statt event.x und event.y event.x_root und event.y_root nutzt. Danke, mawe, dass du mich an dieses Feature erinnert hast, und das Wissen ist keinesfalls sinnlos :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Wie kann man die Koordinaten im Tk auslesen?

Komme da leider einfach nicht weiter:

Code: Alles auswählen

from Tkinter import *

def MausPosition(event):
    MausPosText = event.x, event.y
    event.widget.config(text = MausPosText)

root = Tk()
Button1 = Button(root, width = '10', height = '5', text = 'test')
Button1.place(y=50,x=50)
Button1.bind("<Button-1>", MausPosition)

mainloop()
Der liest zwar die Koordinaten aus, aber nur die innerhalb des Buttons.
Will aber eben gerne die Daten von Tk haben.
Geht dies überhaupt, oder muß ich dies alles in Canvas packen?
Oder geht es mit einem Art Trick, in dem man bei der Funktion der MausPositon ein Event für das Tk.root auslöst?
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Bin jetzt selbst ein Stück weiter gekommen, nachdem ich endlich rausgefunden habe, wie man den Code von mawe anwenden muß:

Code: Alles auswählen

from Tkinter import *

def MausPosition(event):
    MausPosText = root.winfo_pointerxy()
    event.widget.config(text = MausPosText)

root = Tk()
Button1 = Button(root, width = '10', height = '5', text = 'test')
Button1.place(y=50,x=50)
Button1.bind("<Button-1>", MausPosition)
Nur leider, zeigt er die Postion vom Curser ausgehend vom ganzen Bildschim an. Also je nach dem ob das root.Tk oben links oder recht unten ist (ect.), sind die Koordinaten ganz anders.
Aber ich hätte gerne die Coords innerhalb des Tk und nicht innerhalb des ganzen Bildschirms (wobei Zweiteres ich vielleicht auch mal brauchen könnte, aber halt nicht derzeit).
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
BlackJack

Schau doch mal woran Du den Mausknopf bindest -- an den Button. Binde ihn doch einfach an das oberste Fenster und schon bekommst Du die relativen Koordinaten davon.
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

BlackJack hat geschrieben:Schau doch mal woran Du den Mausknopf bindest -- an den Button. Binde ihn doch einfach an das oberste Fenster und schon bekommst Du die relativen Koordinaten davon.
Ich binde nur die Aktion an das Button. Und so soll es auch sein, weil er erst dann, wenn ich auf das Button klicke, die aktuelle Mausposition einlesen soll.
Und die Position die er dann ausliest, ist die von 'root', also dem Tk. Aber eben leider nicht innerhalb des Tk, sondern innerhalb des ganzen Bildschirms.

Edit:
Korrektur: Nicht Tk, weil dort weis ich nicht, wie ich die Postion abfragen kann, sondern cv.(Canvas). Das Problem bleibt aber leider das gleiche.


Edit2:
Langsam komme ich hinter das eigentliche Problem:
winfo_pointerxy()
scheint generell die Koordinaten am ganzen Bildschirm auszuspucken, egal mit was die verknüpft sind (also ob Button1.winfo_ ... oder eben cv.winfo_ ..., das scheint egal zu sein ??).
Bräuchte also etwas, was die Koordinaten vom Fenster selbst auslesen kann.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
BlackJack

Erwin hat geschrieben:Edit2:
Langsam komme ich hinter das eigentliche Problem:
winfo_pointerxy()
scheint generell die Koordinaten am ganzen Bildschirm auszuspucken, egal mit was die verknüpft sind (also ob Button1.winfo_ ... oder eben cv.winfo_ ..., das scheint egal zu sein ??).
Ja das ist egal. Lies doch einfach noch mal die Artikel in diesem Thread durch. Das steht da recht deutlich.
Bräuchte also etwas, was die Koordinaten vom Fenster selbst auslesen kann.
Genau. Du musst die Funktion eben einfach an das Toplevel-Widget, also in diesem Fall `root` binden und die Attribute `x` und `y` vom Event-Objekt auswerten.
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

@ BlackJack

Kann Dir jetzt nicht so ganz folgen.
Liegt vielleicht daran, weil ich inzwischen das gewünschte Ergenbis hinbekommen habe.
Kommt aber, glaube ich, so ungefähr hin, bzw. war ja das, was ich ständig versuchte hinzubekommen, was mir endlich auch gelang.

Danke Euch allen.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Antworten