2016-07-13 20 views
2

Ich erstelle ein Turtle-Programm, das den Befehl von einem Text-Widget erhält und dann auf einen tkinter Canvas zeichnet. Aber wenn ich eval(), die aus dem Text Widget gebieten, würde das Programm eine Python-Shell werden (Es wäre sogar print("Hello World") als Schildkröte Befehl akzeptieren)Tkinter: Wie man den Benutzer auf eine Reihe von Funktionen beschränkt

Hier ist, was ich versuche zu sagen:

from tkinter import * 
import turtle 
root = Tk() 
canvas = Canvas(root) 
tt = turtle.RawTurtle(canvas) 
def moveForward (pixels):#Custom function 
    tt.forward(pixels) 

command = "print("Hello World")" 
yourCommand = eval(command) # it would accept this as a turtle command 

root.mainloop() 

Kann jemand erklärt mir, wie man die Benutzereingabe auf die erzeugten benutzerdefinierten Befehle beschränkt. Danke im Voraus !

+0

Sie könnten eine Liste der akzeptierten Befehle erstellen und vor der Auswertung prüfen, ob die Benutzereingabe eine davon ist. Dies erfordert wahrscheinlich einige Regex-Überprüfung. –

Antwort

2

Vermeiden Sie eval() - betrachten Sie stattdessen eine Datenstruktur von legalen Befehlen und behandeln Sie den Code, der diese Befehle als Daten implementiert. Ich habe ein Beispiel unten nur mit dem Schildkröte-Modul implementiert es einfach zu halten:

import turtle 

commands = { 
    'moveForward': lambda pixels: turtle.forward(pixels), 
    'moveBackward': lambda pixels: turtle.backward(pixels), 
    # ... 
} 

command, *arguments = input().strip().split() 

if command in commands: 
    (commands[command])(int(arguments[0])) 

turtle.mainloop() 

Starten Sie das Programm und geben Sie ‚moveForward 100‘ und es sollte tun, was Sie fragen, kein eval benötigt. Dies kann mit Informationen im Wörterbuch über die Anzahl und Arten der Argumente für jeden Befehl ausgefeilter werden.