2010-11-19 9 views
5

Ich würde gerne wissen, wie (wenn möglich), um eine bestimmte Phrase oder ein Wort zu hören, die in ein Textfeld eingegeben wird und den Befehl ausführen.Python Tkinter Listener in Textfeld

Zum Beispiel wenn ich den Ausdruck "turn me red" eingeben würde ich gerne wissen, ob es möglich ist, es rot zu drehen, ohne Enter drücken.

Ich habe gerade angefangen und hier ist das, was ich habe:

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

Wer weiß, was zu tun ist? – DonJuma

Antwort

4

Also dachte ich, es wäre ein wenig sauberer sein, wenn anstatt Code zu bearbeiten, i vorgesehen nur ein frisches Beispiel Code arbeiten, die das Verhalten zeigt, die Sie interessieren

Hier ist, was der folgende Code tut. Wenn Wenn Sie es ausführen, erhalten Sie ein kleines Widget mit einem leeren Textfeld (technisch, ein Label in Tkinter) für den Benutzer einen gewissen Wert zu liefern. Wenn sie einen numerischen Wert (Integer oder Float) eingeben und dann auf die Schaltfläche Calculate klicken, erscheint der entsprechende Wert in Metern direkt darunter. Wenn jedoch die Benutzerschlüssel in ‚rot‘, dann wird das Wort ‚blau‘ erscheint, sobald es eingegeben wird - d. H, Blau wird angezeigt, obwohl die berechnen Taste noch irgendetwas anderes geklickt wurde.

Wie Sie in der vorletzten Zeile unten sehen können, ist es nur eine Frage, das gewünschte Verhalten in der Tkinter Ereignissyntax zu beschreiben.

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

Ich bin auf Windows und es sagt, es kann nicht ttk finden. Kommt das mit Python? Ich habe es gegoogelt, aber nur Linux-Sachen gefunden? VERWENDEN SIE PYTHON V 2.6 – DonJuma

+0

einfach loswerden, d. H. Ersetzen Sie jedes Vorkommen von 'ttk.' mit '' (und natürlich entfernen Sie die Zeile importieren ttk). – doug

+0

Oh okay toll, es hat sehr gut funktioniert. – DonJuma

1

Was Sie wollen sicherlich möglich ist. Die Lösung hängt davon ab, was Sie wirklich wollen.

Möchten Sie etwas rot nur dann drehen, wenn der Benutzer "rot" genau eingibt? Oder, wenn der Text "mich blau drehen" und sie das Wort "blau" zu "rot" ändern, wird dies die Aktion auslösen?

Wenn erstere (muss genau "turn me red" eingeben), können Sie einfach an die genaue Sequenz binden (zB: widget.bind("<t><u><r><n><space><m><e>....", doSomething)). Es wird jedoch unmöglich zu verwalten, wenn Sie auch "Turn ME Red" das gleiche tun wollen.

Wenn letzteres (wann immer Sie etwas eingeben, es sieht, ob "rot drehen" den Einfügepunkt umgibt), ist es ein kleines bisschen mehr Arbeit. Sie können unter <KeyRelease> binden und dann die Zeichen vor dem Einfügepunkt für die magische Phrase betrachten.

Bottom Line ist, Sie richten eine Bindung entweder auf etwas Generisches wie <KeyRelease> dann treffen Sie die Entscheidung in den Rückruf, oder richten Sie eine sehr spezifische Bindung für eine genaue Phrase.

+0

Wie würdest du über die gehen, gibt es ein Beispiel, zu dem du verlinken kannst, weil du das ziemlich neu sagen kannst. – DonJuma