2016-06-02 13 views
-1

Ich habe an einem Text-basierten Spiel in Tkinter gearbeitet, und ich brauche einen Weg, um mehr Flexibilität bei der Eingabe zu ermöglichen. Im Grunde, was ich suche ist, wie man Code:Tkinter Eingabesubstitutionen

if Input.get() == "look at" Item: 
    Item.look() 

Aber mit der Flexibilität von ‚item‘ ist eine Klasse, mit den Unterklassen, von denen alle sein kann ‚betrachtet‘. Dies ist mein aktueller (nicht funktionierenden) Code für dieses Segment:

def Check(): 
    if Output == "look at" Item: 
     Item.look() 
    else: 
     pass 
class Item(): 
    def __init__(self, name, description, value, quantity): 
     self.name = name 
     self.description = description 
     self.value = value 

    def look(self): 
     Look.Title = "{}".format(self.name) 
     Look.Description = "{}".format(self.Description) 
     Look.Value = "{} is worth {}.".format(self.name, self.value) 
     Details.insert(Look.Title) 
     Details.insert(Look.Description) 
     Details.insert(Look.Value) 
     Details.insert(Look.Quantity) 
class Headphones(Item): 
    def __init__(self): 
     super.__init__(name = "Headphones", description = "A set of high quality white headphones.", value = 150) 

Jede Hilfe sehr geschätzt wird,
Blaze

+0

Was denkst du, was das bedeutet: 'if Input.get() ==" siehe "Item:'? Das ist eine ungültige Syntax, und ich kann nicht erraten, was Ihrer Meinung nach der 'Item'-Teil tut. Willst du es mit "Schau" verketten? Fragen Sie, wie man die Benutzereingabe von '' look at headphones "' zum Ausführen des Codes 'headphones.look()' –

+0

umwandelt. Ich habe es so versucht, weil es einen anderen Code gibt (den ich vergessen habe), der so funktioniert . Aus irgendeinem Grund. Und ich frage, wie man eine Benutzereingabe von "schaue auf Kopfhörer", um headphones.look(), oder "goggles" zu schauen, um goggles.look() laufen zu lassen, oder "look at phone", um Telefon zu laufen. look(), etc, so dass es auf jedem Gegenstand laufen kann. – user2778363

Antwort

0

Sie müssen irgendeine Art von Mapping zwischen dem Eingang tun, und den Funktionen, die Sie möchte anrufen. Sie müssen die Zeichenfolge analysieren, um das Objekt aus der Eingabezeichenfolge zu entfernen, und das Ergebnis der Syntaxanalyse verwenden, um das richtige Objekt oder die korrekte Klasse nachzuschlagen.

Zum Beispiel könnten Sie einen regulären Ausdruck verwenden, um die Zeichenfolge "Look at X" zu analysieren und dann "X" als Index in ein Wörterbuch zu verwenden, um zu wissen, welche Klasse instanziiert werden soll.

Hier ist ein einfaches Beispiel:

import re 

class Headphones(object): 
    def look(self): 
     print("you are looking at headphones") 

class Goggles(object): 
    def look(self): 
     print("you are looking at goggles") 

class Unknown(object): 
    def look(self): 
     print("I don't know what you're looking at") 

def check(input): 
    map = { 
     "goggles": Goggles, 
     "headphones": Headphones, 
    } 

    match = re.match(r'look at (.*)', input) 
    if match: 
     thing = match.group(1) 
     cls = map.get(thing, Unknown) 
     object = cls() 
     object.look() 

for phrase in ("look at headphones", 
       "look at goggles", 
       "look at something else"): 
    check(phrase) 

Hinweis: Diese eine von vielen Möglichkeiten, das Problem zu lösen. Der Punkt ist, müssen Sie:

  1. einen Parser schreiben, die die wichtigen Teile aus dem Eingangsherausziehen können, und
  2. das Ergebnis der Analyse der Bühne verwenden, um zu entscheiden, wie die Daten zu verarbeiten

Der Parser kann alles sein, von der einfachen Teilung der Eingabe in Leerzeichen und dem Ergreifen des letzten Wortes, bis zur Verwendung eines regulären Ausdrucks, bis zur Verwendung eines vollständigen Parsers, der etwas wie pyparsing verwendet.