2016-10-29 6 views
0
def gate(i): 
input.bind('<Return>', gate(input.get('end-1c linestart', 'end-1c lineend'))) 
inputDatabase.run(i) 

input.bind('<Return>', gate(input.get('end-1c linestart', 'end-1c lineend'))) 

input ist ein Tkinter Textobjekt.Wie eine unendliche Tastatur in Python 3 Tkinter

Ich mache eine Konsole, so dass, wenn der Benutzer die Return-Taste drückt, es die letzte Zeile im Textobjekt erhält. Das muss für immer passieren.

Gibt . Wie kann ich das schaffen? Ich habe versucht, Threads zu verwenden, aber sie sind unendlich, und weil sie die Ressource (glaube ich) des Textobjekts teilen, müssen sie Sperren verwenden, und ich konnte nicht herausfinden, wie das geht. Wenn irgendjemand erklären könnte, wie man Sperren, Threading oder irgendetwas von der Art verwendet, die extrem hilfreich wäre. Vielen Dank! Zwei weitere Dinge: bitte nicht vorschlagen, die System-Rekursionstiefe zu ändern, und ich würde es auch bevorzugen, wenn die Antwort eher prozedural als stark objektorientiert wäre. Es ist jedoch nicht so wichtig. Nochmals vielen Dank im Voraus.

+0

binden Funktionsnamen erwarten - es bedeutet, ohne() und Argumente. Jetzt startet Python beim Start 'gate()', um das Ergebnis an '' zu binden, aber innerhalb 'gate()' ist ein weiteres 'gate()', so dass Rekursion entsteht. Warum benutzt du 'gate()' in 'gate()' ??? – furas

+0

@furas Damit es für immer läuft – Ember

+0

wird es für immer laufen (oder bis "maximale Rekursion Tiefe überschritten"), aber ich weiß nicht, warum Sie diese Konstruktion brauchen. – furas

Antwort

0

Was mich brauchen Sie

def gate(event): 
    i = input.get('end-1c linestart', 'end-1c lineend') 
    inputDatabase.run(i) 

# --- 

input.bind('<Return>', gate) 

EDIT: habe ich vergessen event in vorherigen Code (jetzt wird hinzugefügt).

Tkinter gate mit dem Argument binded ausführt, die Sie so den Zugriff auf widget gibt es anstelle von input

def gate(event): 
    i = event.widget.get('end-1c linestart', 'end-1c lineend') 
    inputDatabase.run(i) 

# --- 

input.bind('<Return>', gate) 
+0

Ihr Code wird nicht funktionieren. 'gate' wird ein Ereignisobjekt als Parameter erhalten, wenn das Ereignis ausgelöst wird. –

+0

@BryanOakley Ja, ich habe das Ereignis vergessen :) – furas

1

Das Problem verwenden können, ist, dass Sie nicht richtig das zu tun sind verbindlich. In Ihrer Bind-Anweisung rufen Sie sofort die Funktion auf und machen dann dasselbe in der Funktion.

Mit anderen Worten, dies:

input.bind('<Return>', gate(input.get('end-1c linestart', 'end-1c lineend'))) 

ist genau das gleiche wie folgt aus:

value = input.get('end-1c linestart', 'end-1c lineend') 
input.bind('<Return>', value) 

Da Sie tun das innerhalb der Funktion, wenn die Funktion sofort selbst ruft erneut aufgerufen wird , die sich sofort wieder aufruft, was ... weshalb du einen Rekursionsfehler bekommst.

Sie müssen eine aufrufbare an die bind Methode übergeben. Es ist eine bewährte Methode, zu vermeiden, dass Lambda immer einen Bind-Aufruf als Funktion hat, es sei denn, Sie müssen Argumente übergeben. Wenn Sie das Ereignis ordnungsgemäß binden, müssen Sie die Bindung nur einmal festlegen, damit sie für die gesamte Lebensdauer des Programms funktioniert.

Zum Beispiel:

def gate(event): 
    i = input.get('end-1c linestart', 'end-1c lineend') 
    inputDatabase.run(i) 

input.bind('<Return>', gate) 
+0

Was ist das 'Ereignis' Argument? (neu dazu :) – Ember