2010-11-19 6 views
5

Je voudrais savoir comment (si possible) pour écouter une certaine phrase ou un mot qui est entré dans une zone de texte et exécuter une commande. Par exemple, si je tape la phrase «tourne-moi en rouge», je voudrais savoir s'il est possible de l'allumer en rouge sans appuyer sur enter.Python Tkinter écouteur dans la zone de texte

Je viens de commencer et voici ce que j'ai:

from Tkinter import * 

class mywidgets: 
    def __init__(self,root): 
     frame=Frame(root) 
     frame.pack() 
     self.txtfr(frame) 
     return 

    def txtfr(self,frame): 

     #define a new frame and put a text area in it 
     textfr=Frame(frame) 
     self.text=Text(textfr,height=10,width=50,background='white') 

     # put a scroll bar in the frame 
     scroll=Scrollbar(textfr) 
     self.text.configure(yscrollcommand=scroll.set) 

     #pack everything 
     self.text.pack(side=LEFT) 
     scroll.pack(side=RIGHT,fill=Y) 
     textfr.pack(side=TOP) 
     return 
def main(): 
    root = Tk() 
    s=mywidgets(root) 
    root.title('textarea') 
    root.mainloop() 
main() 
+0

quelqu'un sait quoi faire? – DonJuma

Répondre

4

donc je pensais que ce serait un peu plus propre si au lieu de modifier votre code, je viens de donner un nouvel exemple de code de travail qui présente le comportement que vous êtes intéressé par

Voici ce que le code fait ci-dessous:. Lorsque vous l'exécutez, vous obtenez un petit widget avec une zone de texte vide (techniquement, un Label dans Tkinter) pour l'utilisateur de fournir une certaine valeur. Lorsqu'ils saisissent une valeur numérique (entier ou flottant), puis cliquez sur le bouton Calculer puis la valeur équivalente en mètres apparaît juste en dessous. Si toutefois l'utilisateur tape en 'rouge' alors le mot 'bleu' apparaît dès qu'il est entré - c'est-à-dire, Bleu apparaîtra même si le bouton Calculer ou tout autre élément a été cliqué.

Comme vous pouvez le voir dans la pénultième ligne ci-dessous, obtenir le comportement que vous voulez est juste une question de décrire le comportement que vous voulez dans la syntaxe de l'événement Tkinter.

from Tkinter import * 
import ttk 

root = Tk() 

def calculate(*args) : 
    value = float(feet.get()) 
    meters.set((0.305 * value * 10000. + .5)/10000.) 

def callback_function(*args) : 
    meters.set('blue') 

mf = ttk.Frame(root, padding="3 3 12 12") 
mf.grid(column=0, row=0, sticky=(N, W, E, S)) 
mf.columnconfigure(0, weight=1) 
mf.rowconfigure(0, weight=1) 

feet = StringVar() 
meters = StringVar() 

feet_entry = ttk.Entry(mf, width=7, textvariable=feet) 
feet_entry.grid(column=2, row=1, sticky=(W, E)) 

ttk.Label(mf, textvariable=meters, background='#E9D66B').grid(column=2, 
      row=2, sticky=(W, E)) 

ttk.Button(mf, text="Calculate", command=calculate).grid(column=2,row=3, 
      sticky=W) 

ttk.Label(mf, text="feet").grid(column=3, row=1, sticky=W) 
ttk.Label(mf, text="is equivalent to").grid(column=1, row=2, sticky=E) 
ttk.Label(mf, text="meters").grid(column=3, row=2, sticky=W) 

for child in mf.winfo_children(): 
    child.grid_configure(padx=5, pady=5) 

feet_entry.focus() 
root.bind('<Return>', calculate) 

# this is the key line 
root.bind('red', callback_function) 

root.mainloop() 
+0

Je suis sur les fenêtres et il dit qu'il ne peut pas trouver ttk. Est-ce que cela vient avec python. Je l'ai googlé mais j'ai seulement trouvé des trucs Linux? À l'aide de PYTHON V 2.6 – DonJuma

+0

, supprimez-le, c'est-à-dire remplacez toutes les occurrences de 'ttk.' avec '' (et évidemment supprimer la ligne d'importation ttk). – doug

+0

Oh d'accord, ça a beaucoup fonctionné. – DonJuma

1

Ce que vous voulez est certainement possible. La solution dépend de ce que vous voulez vraiment.

Voulez-vous activer quelque chose de rouge uniquement si l'utilisateur tape "Turn Me Red" avec précision? Ou, si le texte est "tourne-moi en bleu" et qu'ils changent le mot "bleu" en "rouge", cela déclenchera-t-il l'action?

Si le premier (doit taper exactement "rouge"), vous pouvez simplement lier à cette séquence exacte (par exemple: widget.bind("<t><u><r><n><space><m><e>....", doSomething)). Il devient impossible de gérer, cependant, si vous voulez aussi "Turn ME Red" faire la même chose. Si ce dernier (chaque fois que vous tapez quelque chose, il semble voir si "tourner en rouge" entoure le point d'insertion), c'est un peu plus de travail. Vous pouvez lier sur <KeyRelease> et ensuite regarder les caractères avant le point d'insertion pour la phrase magique.

En fin de compte, vous définissez une liaison sur quelque chose de générique comme <KeyRelease> puis prenez la décision dans le rappel, ou définissez une liaison très spécifique pour une phrase exacte.

+0

comment voulez-vous aller sur le est là un exemple que vous pouvez lier, car comme vous pouvez le dire im assez nouveau. – DonJuma

Questions connexes