2011-12-30 85 views
6

我綁定的事件<Return>一個按鈕,認爲這會導致command要運行擊中後進入綁定<Return>到按鈕無法按預期工作

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) 

但它不會做任何東西。 self.search輸入被按下時我要做什麼?

回答

12

您的代碼看起來不錯,但請注意,如果您想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

參考:

+0

謝謝,現在對我來說更加清楚。只要問一下這些是什麼:「** kwargs和* args」爲? – Thomas 2012-01-02 13:50:05

+0

我添加了爲什麼我使用'** 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