2011-12-30 9 views
6

ho legato l'evento <Return> a un pulsante, pensando che questo potrebbe causare il command da eseguire dopo aver colpito Inserisci:Binding <Return> al pulsante non funziona come previsto

Button(self.f, text="Print", command=self.Printer).pack(side=RIGHT, padx=10, pady=10) 
self.button1 = Button(self.f, text="search", command=self.search) 
self.button1.bind('<Return>', self.search) 
self.button1.pack(side=RIGHT, padx=10, pady=10) 

Ma non lo fanno nulla. Che cosa devo fare per self.search da eseguire quando Enter viene premuto?

risposta

12

Il codice sembra buono, ma si noti che l'attenzione deve essere sul pulsante se si desidera Return chiamare self.search(). È possibile modificare lo stato attivo da widget a widget premendo Tab. Il widget a fuoco è delineato con una sottile linea nera. Potrebbe essere necessario premere Tab una o più volte per spostare lo stato attivo sul pulsante prima di premere Return.

Se si desidera Return a lavorare qualsiasi punto della finestra GUI, quindi modificare

self.button1.bind('<Return>', self.search) 

a

root.bind('<Return>', self.search) 

dove root = tk.Tk().

Per esempio, confrontare button.bind con master.bind nel seguente codice:

import Tkinter as tk 

class SimpleApp(object): 
    def __init__(self, master, **kwargs): 
     title = kwargs.pop('title') 
     frame = tk.Frame(master, **kwargs) 
     frame.grid() 
     button = tk.Button(frame, text = 'search', command = self.search) 
     button.grid() 
     button.bind('<Return>', self.search) 
     # uncomment if you want `<Return>` bound everywhere. 
     # master.bind('<Return>', self.search) 
    def search(self,*args): 
     print('searching...') 

def basic(): 
    root = tk.Tk() 
    app = SimpleApp(root, title = 'Hello, world') 
    root.mainloop() 

basic() 

In alternativa, è possibile utilizzare

button.bind('<Return>', self.search) 
    button.focus() 

Facendo in questo modo, premendo Return chiamate self.search() solo quando il il pulsante ha lo stato attivo, ma il pulsante diventa attivo quando l'app inizia.


Per quanto riguarda l'uso di *args e **kwargs:

**kwargs permette argomenti a parola chiave arbitrarie da passare a __init__.

Quando **kwargs viene utilizzato in una definizione di funzione come questa:

def __init__(self, master, **kwargs): 

e istanziamo SimpleApp simili:

app = SimpleApp(root, title = 'Hello, world') 

poi Python imposta kwargs ad un dict contenente gli argomenti chiave, ad esempio {'title':'Hello, world'}. Si noti che è **kwargs sintassi Python che può essere utilizzato solo in definizioni di funzioni e chiamate di funzione (vedi sotto), ma kwargs stessa è solo un dict.

kwargs viene quindi passato Frame:

frame = tk.Frame(master, **kwargs) 

Ora, quando kwargs ** è utilizzato in una chiamata di funzione, le coppie di valori-chiave nei kwargs dict ottenere in espansione in modo che la chiamata di funzione sopra è equivalente a

frame = tk.Frame(master, title = 'Hello, world') 

Dal Frame può prendere numerosi argomenti a parola chiave, e io non li so e non desidero enumerare loro, è vantaggioso utilizzare **kwargs. Si noti anche che se nuovi argomenti delle parole chiave sono stati aggiunti a Frame in un secondo momento, il mio codice funzionerà ancora, mentre se ho esplicitato esplicitamente le parole chiave, il mio codice non "aggiornerebbe" automaticamente se le parole chiave consentite di Frame dovessero cambiare .

*args, allo stesso modo, consente di includere argomenti posizionali arbitrari search:

def search(self,*args): 

Python imposta args ad una lista contenente tutti gli argomenti posizionali inviati a search quando search si chiama.

Ho usato * args perché self.search viene chiamato senza argomenti o un argomento.

Quando si dice

button = tk.Button(frame, text = 'search', command = self.search) 

self.search() viene richiamata senza argumens quando il pulsante viene premuto. Ma quando si dice

button.bind('<Return>', self.search) 

self.search(event) viene chiamato con un solo argomento, quando si preme il tasto Return. event è un Tkinter.Event che ha attributi (tempo, stato, tipo, widget, x, y, ecc.) Che ti permettono di sapere di più su quale evento ha avuto luogo.

altro, forse meglio, modo per definire search sarebbe stato

def search(self, event = None): 
    ... 

Questo avrebbe fatto capire che search può essere passata 0 o 1 argomenti, e non semplicemente e numero arbitrario di argomenti. Inoltre, avrebbe fornito un accesso più semplice allo event se un evento fosse passato a search.

Riferimento:

+0

Grazie, ora è più chiaro per me. Basta mettere in discussione cosa significa "** kwargs e * args"? – Thomas

+0

Ho aggiunto una spiegazione del perché ho usato '** kwargs' e' * args'. Se è troppo lungo da leggere, vedere [spiegazione saltcrane] (http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/). – unutbu

Problemi correlati