2016-10-29 3 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 est un objet texte tkinter.Comment avoir un keybind infinie en python 3 Tkinter

Je fais une console, de sorte que lorsque l'utilisateur appuie sur la touche de retour, il obtient la dernière ligne dans l'objet texte. Cela doit arriver pour toujours.

Donne RecursionError: maximum recursion depth exceeded. Comment puis-je faire ce travail? J'ai essayé d'utiliser des threads, mais ils sont infinis, et parce qu'ils partagent la ressource (je pense) de l'objet texte, ils doivent utiliser des verrous, et je ne pouvais pas comprendre comment faire cela. Si quelqu'un pouvait expliquer comment utiliser les verrous, le filetage ou quoi que ce soit de ce genre, cela serait extrêmement utile. Merci! Aussi deux choses de plus: ne pas suggérer de changer la profondeur de récursion du système s'il vous plaît, et je préférerais aussi que la réponse soit procédurale plutôt que fortement orientée objet. Cela n'a cependant pas trop d'importance. Encore une fois, merci d'avance.

+0

bind attendre nom de la fonction - cela signifie sans() et arguments. Maintenant, Python à la porte() l'exécution de démarrage '' lier résultat '' mais à l'intérieur 'porte()' 'est une autre porte()' si vous obtenez récursivité. Pourquoi utilisez-vous 'gate()' dans '' gate() '??? – furas

+0

@furas Alors qu'il fonctionnera toujours – Ember

+0

il fonctionnera toujours (ou jusqu'à 'profondeur maximum de récursivité exceeded') mais je ne sais pas pourquoi vous avez besoin de cette construction. – furas

Répondre

0

Quant à moi dont vous avez besoin

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

# --- 

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

EDIT: J'oublièrent event dans le code précédent (maintenant il est ajouté).

Tkinter exécute binded gate avec l'argument qui vous donne accès à widget que vous pouvez donc l'utiliser au lieu de input

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

# --- 

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

Votre code ne fonctionnera pas. 'gate' recevra un objet événement en tant que paramètre lorsque l'événement est déclenché. –

+0

@BryanOakley oui, j'ai oublié l'événement :) – furas

1

Le problème est que vous ne faites pas la liaison correctement. Dans votre instruction bind, vous appelez immédiatement la fonction, puis faites la même chose dans la fonction.

En d'autres termes, ceci:

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

est exactement la même que celle-ci:

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

Puisque vous faites qu'à l'intérieur de la fonction, lorsque la fonction est appelée, elle se fait appeler immédiatement à nouveau , qui s'appelle immédiatement à nouveau, ce qui ... c'est pourquoi vous obtenez une erreur de récursivité.

Vous devez transmettre un appelable à la méthode bind. C'est une bonne pratique pour éviter que lambda ait toujours une fonction bind à moins que vous n'ayez besoin de passer des arguments. Lorsque vous liez l'événement correctement, vous devez uniquement définir la liaison une fois pour qu'elle fonctionne pendant toute la durée du programme.

Par exemple:

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

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

Quel est l'argument 'event'? (nouveauté :) – Ember