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:
Grazie, ora è più chiaro per me. Basta mettere in discussione cosa significa "** kwargs e * args"? – Thomas
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