2017-02-14 3 views
1

Dieser Code muss ein Dreieck verschieben, wenn Sie die Eingabetaste drücken. Meine Antwort ist richtig, aber ich verstehe das nicht wirklich.Python - Parameter manchmal ja und manchmal nein

Beobachten Sie die Zeile innerhalb der Option 1->def mov() dies sollte funktionieren, wenn ich es anrufe, aber es ist nicht.

Jetzt lass uns Option2 wieder loslassen->def mov(A) schauen Ich habe einen Parameter dort (A) aber dieser Parameter hat keine Verbindung mit etwas, warum ist es dann nicht mit meiner Option 1? ist es nicht das Gleiche? Wie kann ich wissen, wann ich einen Hilfsparameter wie diesen verwenden muss?

OPTION 1 -FAIL

from Tkinter import * 
tk=Tk() 
canvas=Canvas(tk,width=400,height=400) 
canvas.pack() 
canvas.create_polygon(10,10,10,60,50,35) 
def mov(): 
    canvas.move(1,5,0) 
canvas.bind_all('<KeyPress-Return>',mov) 

OPTION2 -Work

from Tkinter import * 
tk=Tk() 
canvas=Canvas(tk,width=400,height=400) 
canvas.pack() 
canvas.create_polygon(10,10,10,60,50,35) 
def mov(A): 
    canvas.move(1,5,0) 
canvas.bind_all('<KeyPress-Return>',mov) 
+0

die 'bind_all' einfach ** erwartet eine Methode, die einen Parameter ** nimmt. –

+0

auch wenn diese Methode nicht damit arbeiten? Wie weißt du, wenn eine andere Methode wie bind_all eine andere Methode benötigt, die einen Parameter akzeptiert? – Shiki

+1

ja, weil der Anrufer das nicht wissen kann. –

Antwort

4

Wenn lesen Sie in der Dokumentation von bind (bind_all ein Wrapper ist um bind als here dokumentiert ist, nach vorne zu bind über die gesamte Anwendung):

Die bind Methode aus dem Widget-Befehl ermöglicht es Ihnen, nach bestimmten Ereignissen zu suchen und eine Callback-Funktion auszulösen, wenn das Ereignis auftritt. Die Form der bind-Methode ist:

def bind(self, sequence, func, add=''):

wobei:

  • sequence: eine Zeichenfolge ist, die das Ziel Art von Ereignisse bezeichnet. (Siehe die Bindman-Seite und Seite 201 von John Ousterhout 's Buch für Details).

  • func: ist eine Python-Funktion, , die ein Argument nimmt, das aufgerufen werden soll, wenn das Ereignis eintritt. Eine Ereignisinstanz wird als -Argument übergeben. (Funktionen auf diese Weise eingesetzt werden als Rückrufe allgemein bekannt.)

  • add: optional, entweder '' oder '+'. Das Übergeben einer leeren Zeichenfolge bedeutet, dass diese Bindung alle anderen Bindungen ersetzen soll, denen dieses Ereignis zugeordnet ist. Die Übergabe eines '+' bedeutet, dass diese Funktion der Liste der Funktionen hinzugefügt werden muss, die an diesen Ereignistyp gebunden sind.

(kopiert, hinzugefügt fett gedruckt)

So sind die func Bedürfnisseein Argument zu nehmen.Da die Anrufer nicht wissen können, ob die Rufenen das Argument verwenden oder nicht, hat jede Funktion, die Sie mit bind oder bind_all bindengenau ein Argument haben. Dieses Argument enthält die Ereignisparameter: zum Beispiel die Taste gedrückt wird, usw.

Mit anderen Worten: es ist ein Vertrag, dass Sie eine Funktion mit einem Argument liefern, und Sie müssen diese Verträge respektieren. Ob das Argument verwendet wird oder nicht, spielt für Tkinter keine Rolle.

Verwandte Themen