您的代碼看起來不錯,但請注意,如果您想Return
致電self.search()
,則必須將焦點放在該按鈕上。您可以通過按Tab
將焦點從小部件更改爲小部件。焦點部件用細黑線勾勒出來。在按Return
之前,您可能需要按Tab
一次或多次將焦點移至按鈕。
如果你想Return
在GUI窗口任何地方工作,然後更改
self.button1.bind('<Return>', self.search)
到
root.bind('<Return>', self.search)
其中root = tk.Tk()
。
例如,master.bind
在下面的代碼比較button.bind
:
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()
或者,你可以使用
button.bind('<Return>', self.search)
button.focus()
這樣做,這樣,按Return
電話self.search()
只有當按鈕具有焦點,但該按鈕在應用程序啓動時獲得焦點。
關於使用*args
和**kwargs
:
**kwargs
允許任意關鍵字參數傳遞給__init__
。
**kwargs
當在函數定義使用這樣的:
def __init__(self, master, **kwargs):
和我們實例SimpleApp
這樣的:
app = SimpleApp(root, title = 'Hello, world')
那麼Python設置kwargs
到一個字典包含關鍵字參數,例如{'title':'Hello, world'}
。請注意0是Python語法,它只能用於函數定義和函數調用(見下文),但kwargs
本身只是一個字典。然後
kwargs
傳遞給Frame
:
frame = tk.Frame(master, **kwargs)
現在,當** kwargs在函數調用時,在kwargs
字典的鍵值對得到擴大,使上面的函數調用等效到
frame = tk.Frame(master, title = 'Hello, world')
由於Frame
可以採取許多關鍵字參數,而我不知道所有這些,不想一一列舉,最好使用**kwargs
。 請注意,即使在以後某個日期將新的關鍵字參數添加到Frame
,我的代碼仍然可以正常工作,但是如果我明確列出了關鍵字,那麼如果Frame
的允許關鍵字發生更改,我的代碼將不會自動「升級」 。
*args
,同樣可以讓你隨心所欲包括位置參數來search
:
def search(self,*args):
Python的設置args
包含所有時search
被稱爲發送到search
位置參數列表。
我用*參數在這裏,因爲self.search
被調用時沒有參數或一個參數。
當你說
button = tk.Button(frame, text = 'search', command = self.search)
self.search()
被稱爲無argumens按鈕被按下時。但是,當你說
button.bind('<Return>', self.search)
self.search(event)
按下Return
鍵時用一個參數調用。 event
是一個Tkinter.Event,它具有屬性(時間,狀態,類型,小部件,x,y等),可讓您更詳細地瞭解發生的事件。
另一個,也許更好,方式來定義search
本來
def search(self, event = None):
...
這已經明確表示,search
可以傳遞0或1個參數,而不是簡單地和參數arbitary數。如果事件傳遞給search
,它也可以更容易地訪問event
。
參考:
謝謝,現在對我來說更加清楚。只要問一下這些是什麼:「** kwargs和* args」爲? – Thomas 2012-01-02 13:50:05
我添加了爲什麼我使用'** kwargs'和'* args'的解釋。如果閱讀時間太長,請參閱[saltcrane的解釋](http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/)。 – unutbu 2012-01-02 14:30:59