2016-03-22 16 views
1

Ich bin mit dem Graphics Module Reference „graphics.py“Überprüfen Sie, ob Klicks innerhalb einer grafischen Form sind (Kreis)

Wie schreiben Sie eine Funktion, so dass, wenn der Benutzer klickt innerhalb eines Kreises sollte return true Andernfalls sollte False zurückgegeben werden.

Ich bin nicht sicher, wie man überhaupt anfängt. Ich möchte testen, ob die Klicks eines Nutzers innerhalb einer Form liegen oder nicht.

Antwort

1

Verwenden Sie getMouse(). Dies pausiert für einen Benutzerklick und gibt dann die Position (als Punkt) der Maus in einem Fenster zurück. checkMouse() gibt die Position der Maus zurück, ohne dass ein Klick erforderlich ist.

zum Beispiel:

win = GraphWin('Example Window', 100, 100) 
mousePos = win.getMouse() 

Jetzt, zu verwenden, um festzustellen, ob der Benutzer auf einem Kreis angeklickt:

def isClicked(circle, mousePos): 
    distance = sqrt(((mousePos.x - circle.x) ** 2) + ((mousePos.y - circle.y) ** 2)) 
    return distance < circle.radius 

die Ihre Funktion seien.

Beispiel für Code, der die Funktion verwenden würden:

from graphics import * 
from math import sqrt 

def isClicked(circle, mousePos): 
    distance = sqrt(((point.x - circle.x) ** 2) + 
        ((point.y - circle.y) ** 2)) 
    return distance < circle.radius 

def main(): 
    win = GraphWin('Example Window', 100, 100) 
    circle = Circle(Point(50,50), 25) 
    circle.setFill('blue') 
    circle.draw(win) 
    mousePos = win.getMouse() 
    if isClicked(circle, mousePos): 
     print "You clicked in the circle!" 
    else: 
     print "You clicked outside the circle!" 

main() 
+1

gibt es einen anderen Weg, ohne die "from math import sort" zu verwenden? –

+0

Fragen Sie das, weil beim Import aus Mathe ein Fehler auftritt? Auf Tippfehler prüfen. Es ist nicht so. Das steht für "Quadratwurzel". Ich könnte nur ausbleichen, aber ich kann mir keinen Weg vorstellen, um zu berechnen, ob ein Punkt innerhalb des Kreises ist, ohne die Funktionen sqrt oder sine zu verwenden. –

+0

Dieser Beispielcode funktioniert nicht wirklich. Der erste Fehler ist, "NameError: globaler Name 'Punkt' ist nicht definiert" aufgrund eines falsch benannten formalen Parameters zu 'isClicked()'. Aber das behebend, mit dem aktuellen graphics.py scheitert es mit: "AttributeError: Die Kreisinstanz hat kein Attribut 'x'", weil sie versucht, das 'x' eines Kreises zu bekommen, den sie nicht hat, aber stattdessen einen Mittelpunkt hat ein 'x'. – cdlane

0

is there another way without using the "from math import sort"?

Unter Ihrer Anfrage buchstäblich und Beheben von Fehlern in Dardar Fishcake dem Beispiel, können wir es auf diese Weise tun:

from graphics import * 

def isClicked(circle, point): 
    center = circle.getCenter() 

    distance = ((point.getX() - center.getX()) ** 2 + (point.getY() - center.getY()) ** 2) ** 0.5 

    return distance < circle.radius 

def main(): 
    win = GraphWin('Example', 100, 100) 

    circle = Circle(Point(50, 50), 25) 
    circle.setFill('blue') 
    circle.draw(win) 

    while True: 
     mousePos = win.getMouse() 

     if isClicked(circle, mousePos): 
      print("You clicked in the circle!") 
      break 
     else: 
      print("You clicked outside the circle!") 

    win.close() 

main() 

Hier haben wir x ** 0.5 für sqrt(x) ersetzt. Auch eine kleine Änderung in der Beispiellogik - diese akzeptiert weiterhin Klicks, bis Sie in den Kreis klicken.