Event-Handling Mouse Click mit Matplotplib

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
Bright4.55
User
Beiträge: 7
Registriert: Mittwoch 26. November 2025, 10:31

Hallo zusammen,


weiß jemand vielleicht, wie man einen Mausklick auf einer Grafik abfangen kann, wenn Matplotlib benutzt wird?

Ich weiß, wie es mit pygame funktioniert:

import pygame as p

while running:
for e in p.event.get():
if e.type == p.QUIT:
running = False
elif e.type == p.MOUSEBUTTONDOWN:

if not gameOver and humanTurn:
location = p.mouse.get_pos()
col = location[0]//SQ_SIZE
row = location[1]//SQ_SIZE
if sqSelected == (row, col):
sqSelected= ()
playerClicks = []

--> Ich hätte es gerne genauso auch für Matplotlib. Leider funktioniert es bisher nicht wirklich :/.

import matplotlib.pyplot as plt

Es wird dabei ein Brett gezeichnet mit Plot und Scatter. Ich würde nun gerne die Koordinaten abfangen, wenn ein User auf eine Position drauf klickt (auf ein Scatterposition).

Natürlich währen das Spiel läuft (while running = True).

Gerne würde ich auch einen Doppelklick abfangen ( mit den 2 verschiedenen Koordinaten)

Weiß jemand wie das geht?

Vielen Dank im Voraus.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1313
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Hab ich noch nie gemacht, aber das Beispiel funktioniert: https://matplotlib.org/stable/users/exp ... onnections

Code: Alles auswählen

>>> plt.show()
single click: button=1, x=254, y=521, xdata=4.886228, ydata=0.591410
single click: button=1, x=311, y=280, xdata=6.442060, ydata=0.312718
single click: button=1, x=127, y=425, xdata=1.419727, ydata=0.480396
>>>
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Bright4.55
User
Beiträge: 7
Registriert: Mittwoch 26. November 2025, 10:31

Hi,

vielen Dank schon mal.

Ja, das habe ich auch gesehen, allerdings bekomme ich da immer einen Fehler, wenn ich es versuche bei mir einzubauen:


def onclick(event):
print(
( event.button,
event.x, event.y, event.xdata, event.ydata))



def boardgrid(self):

self.fig, self.ax = plt.subplots(figsize=(self.board.width/2.4, self.board.height/2.4))

cid = self.fig.canvas.mpl_connect('button_press_event', self.onclick)

plt.ion()
plt.show()


Da bekomme ich immer den Fehler:

TypeError: BoardVisualizer.onclick() takes 1 positional argument but 2 were given

Was wäre denn da falsch?
Benutzeravatar
__blackjack__
User
Beiträge: 14276
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bright4.55 Ist `onclick()` auf einer Klasse definiert? Dann bekommt das ja auch das Objekt übergeben, hat dafür aber nicht das `self`-Argument.

Edit: Alternativ könnte man eine `staticmethod()` daraus machen, falls das tatsächlich keine echte Methode sein soll/muss.
“Programming is partially an artform and, like artists, programmers will do it even if they don't get money.” — Linus Torvalds
Bright4.55
User
Beiträge: 7
Registriert: Mittwoch 26. November 2025, 10:31

Hi,

ah, okay. Also so würde es jetzt mal zumindest funktionieren:

@staticmethod
def onclick(event):
print(
( event.button,
event.x, event.y, event.xdata, event.ydata))

cid = self.fig.canvas.mpl_connect('button_press_event', self.onclick)

Ausgabe wäre dann:

(<MouseButton.LEFT: 1>, 188, 152, np.float64(3.9722580645161285), np.float64(3.968571428571428))

Was ich nun gerne hätte, dass wenn man einen Punkt (Scatter ) auf meinem Graphen anklickt, dass dann auch diese Koordinate von dem Punkt ausgegeben wird. Also z.B. x = 2 und y = 4.

Es sollten keine Kommazahlen oder so erscheinen :). Der Graph wird per Scatter auch nur mit nichtkommazahlen aufgebaut.

Wäre super, wenn man mir da noch helfen könnte :)
Sirius3
User
Beiträge: 18350
Registriert: Sonntag 21. Oktober 2012, 17:20

Du suchst also `round`.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1313
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Hinweis: round() ist nicht das kaufmännische runden, sondern Wissenschaftliches runden, dass Fehler minimiert.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Bright4.55
User
Beiträge: 7
Registriert: Mittwoch 26. November 2025, 10:31

Vielen Dank schon mal an alle.

Es hätte soweit nun funtkioniert.

Jetzt hätte ich bloß leider noch ein anderes kleines Problem:

Ich würde gerne auf einen Mausklick von einem User immer warten. Ich habe es schon mit einer while-Schleife probiert, aber leider kommt dann gar keine Ausgabe mehr :/.

Nun wollte ich es mit einem MouseListener probieren:

with mouse.Listener(

on_click=on_click) as listener:

listener.join()

aber leider bekomme ich dann eine Fehlermeldung, dass on_click nicht als Attribut definiert ist, was es ja auch nicht ist. Ich habe es als Funktion in einer Klasse defniert.

Weiß jemand wie man das macht? Und sollte das mit einem Listener funktionieren, dass das Programm an einer Stelle immer solange wartet bis ein Mausklick auf ein Feld erfolgt?

Vielen Dank im Voraus.
Benutzeravatar
__blackjack__
User
Beiträge: 14276
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wo kommt denn `mouse.Listener` her? So auf die Schnelle finde ich das nicht in der Matplotlib-Dokumentation‽
“Programming is partially an artform and, like artists, programmers will do it even if they don't get money.” — Linus Torvalds
Antworten