2016-07-31 5 views
1

Ich weiß, dass diese Frage ziemlich simpel und albern ist, aber ich habe es vermasselt, im Internet zu suchen. Bedenke, wir haben eine 2-dimensionale Liste in Python, die ein Spielfeld von hex repräsentiert und dessen Elemente durch irgendeine Funktion verändert werden (wie Stein in einer Zelle im Spielfeld zu spielen).Wie definiert man eine aufrufbare Funktion, wenn der Wert eines Elements in der Liste geändert wird?

Ich suche nach einem Werkzeug in Python, das eine Funktion definieren kann, die immer dann aufgerufen wird, wenn der Wert eines Elements im Array geändert wird. Ich habe bereits die Funktion trace in tkinter gefunden, die eine Funktion aufruft, wenn StringVar, DoubleVar usw. geändert werden.

Ich frage mich, ob eine ähnliche für einfache Listen oder sogar numply Listen gefunden werden könnte.

+3

Erstellen Sie Ihre benutzerdefinierte Liste (eine Klasse erben von "Liste") und überschreiben Sie "__setitem__" -Methode. Sehen Sie sich auch Event-Manager an. – freakish

+0

'Numpy' Array hat keine solche Funktionalität. Sie können Ihr benutzerdefiniertes Objekt implementieren, indem Sie von der Klasse "numpy.array" erben. Sie können hier http://docs.scipy.org/doc/numpy-1.10.1/user/basics.subclassing.html starten – Kasramvd

+1

Wissen Sie, dass wenn Sie die Liste wie in 'lst [i] = val 'ändern könnte den Code ändern in: 'lst [i] = val; callaback (lst, i) 'und fertig sein? Um Code-Duplikate zu vermeiden, verwenden Sie einfach eine Funktion, um die Elemente zu setzen: 'def set_item (lst, i): lst [i] = wert; callaback (lst, i)'. Sicher können Sie dies durch Vererbung vermeiden, aber das Erben von eingebauten und "numpy" Arrays ist viel weniger trivial als es klingt und * viel * mehr Code. – Bakuriu

Antwort

1

Ihre Anforderungen:

  • 2-dimensinal Liste in Python, die ein Spielbrett von Hex würden

  • und seine Elemente zu einer bestimmten Zelle durch eine bestimmte Funktion verändert werden (wie das Spiel Stein in der steht Spielbrett).

  • Eine Funktion, die aufgerufen wird, wenn der Wert eines Elements im Array geändert wird.

Der straight forward Weg, dies zu implementieren ist, eine Klasse zu definieren, die die board und Aktionen. Es enthält die 2d-Liste (könnte numpy Array sein, aber das ist möglicherweise nicht notwendig).

Es würde auch Methoden definieren, die die Liste ändern und die Aufzeichnung/Rückruf durchführen.

class Board(): 
    def __init__(...) 
     self.list2d=[] # 2d nested list 
    def record_play(...): 
     <action when a cell is changed> 
    def play(...): 
     <change self.list2d> 
     self.record_play(...) 

Solange eine der Board Objekt steuert alle Änderungen, brauchen Sie nicht ein allgemeineres Tracking-Tool, oder sogar eine Unterklasse von Liste oder Array (wenn auch diejenigen sind möglich). Stellen Sie sicher, dass Sie die Tracking-Funktion jedes Mal aufrufen, wenn Sie die Change-Funktion aufrufen.

Wenn Sie dies über verschiedene Klassen und Arten von Objekten tun, könnte es sich lohnen, etwas abstrakteres zu konstruieren. Aber für einen einmaligen Fall, mach einfach das Offensichtliche.

+0

Danke für die Tipps. Wenn Sie tatsächlich Code schreiben könnten, der ausgeführt werden könnte, würde das sehr geschätzt werden. Ich würde viel schneller lernen –