2016-05-16 21 views
0

Ich versuche, ein Programm zu erstellen, wo der Benutzer in einem Fenster klickt, und das erstellt eine Liste der gespeicherten Punkte, die ebenfalls in dem Fenster gezeichnet werden. Der Benutzer kann so oft klicken, wie er möchte. Sobald er jedoch innerhalb des Rechtecks ​​mit der Aufschrift "Fertig" unten links klickt, ist die Liste vollständig.Erstellen Sie eine Liste der gezeichneten Punkte von Mausklicks in einem graphics.py-Fenster

Ich habe bei der Erstellung der Schleife stecken geblieben, die es dem Benutzer ermöglicht, die Punkte zu plotten, bis sie auf "Fertig" klicken.

Hier ist, was ich bisher (ich weiß, dass ich viel bin fehlt):

from graphics import * 
def main(): 
    plot=GraphWin("Plot Me!",400,400) 
    plot.setCoords(0,0,4,4) 


    button=Text(Point(.3,.2),"Done") 
    button.draw(plot) 
    Rectangle(Point(0,0),Point(.6,.4)).draw(plot) 

    #Create as many points as the user wants and store in a list 
    count=0 #This will keep track of the number of points. 
    xstr=plot.getMouse() 
    x=xstr.getX() 
    y=xstr.getY() 
    if (x>.6) and (y>.4): 
     count=count+1 
     xstr.draw(plot) 
    else: #if they click within the "Done" rectangle, the list is complete. 
     button.setText("Thank you!") 


main() 

Was ist der beste Weg, um eine Liste der gespeicherten Punkte vom Benutzer durch Klick im Grafikfenster zu schaffen? Ich plane, diese Punkte später zu verwenden, aber ich möchte nur die Punkte zuerst gespeichert bekommen.

+0

Zu breit und Meinung basierte (im aktuellen Zustand) ... Erstellen Sie einfach auf Mausbewegung/unten Events/und irgendwo um die Liste zu speichern. Ich sehe nichts davon in Ihrem Code. Stattdessen pollst du in einer Schleife, die keine gute Idee ist. Fügen Sie Sprache/IDE- und OS-Tags hinzu, mit denen Sie arbeiten. Ich empfehle dringend, dies zu betrachten: [einfaches Drag & Drop-Beispiel in C++/VCL/GDI] (http://Stackoverflow.com/a/20924609/2521214) mit meinem einfachen Beispiel (vollständige Projekt + exe Zip-Datei enthalten), die hinzufügen können einige Arten von Objekten auf dem Bildschirm, bewegen Sie sie, entfernen Sie sie ... – Spektre

Antwort

0

Die primären Probleme mit Ihrem Code sind: Sie verpassen eine Schleife zum Sammeln und Testen von Punkten; Ihr and Test, um festzustellen, ob der Benutzer in das Feld geklickt hat, sollte ein or Test sein; es ist nicht genug Zeit für den Benutzer, um das "Danke!" Nachricht, bevor das Fenster geschlossen wird.

Um Ihre Punkte zu sammeln, können Sie ein Array verwenden und anstelle der count Variable, einfach die Länge des Arrays die Anzahl darstellen. Im Folgenden ist eine Nacharbeit des Codes, der die oben genannten Fragen behandelt:

import time 
from graphics import * 

box_limit = Point(0.8, 0.4) 

def main(): 
    plot = GraphWin("Plot Me!", 400, 400) 
    plot.setCoords(0, 0, 4, 4) 


    button = Text(Point(box_limit.getX()/2, box_limit.getY()/2), "Done") 
    button.draw(plot) 
    Rectangle(Point(0.05, 0), box_limit).draw(plot) 

    # Create as many points as the user wants and store in a list 
    point = plot.getMouse() 
    x, y = point.getX(), point.getY() 

    points = [point] # This will keep track of the points. 

    while x > box_limit.getX() or y > box_limit.getY(): 
     point.draw(plot) 
     point = plot.getMouse() 
     x, y = point.getX(), point.getY() 
     points.append(point) 

    # if they click within the "Done" rectangle, the list is complete. 
    button.setText("Thank you!") 

    time.sleep(2) # Give user time to read "Thank you!" 
    plot.close() 

    # ignore last point as it was used to exit 
    print([(point.getX(), point.getY()) for point in points[:-1]]) 

main()