2011-12-30 2 views
6

я связала событие <Return> к кнопке, полагая, что это приведет к тому, command будет работать после удара Enter:Привязка <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. Виджет в фокусе очерчен тонкой черной линией. Возможно, вам придется нажать Tab один или несколько раз, чтобы переместить фокус на кнопку, прежде чем нажимать Return.

Если вы хотите Return работать в любом месте в окне GUI, а затем изменить

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

в

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

где root = tk.Tk().

Например, сравните button.bind с master.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'}. Обратите внимание, что **kwargs - это синтаксис Python, который может использоваться только в определениях функций и вызовах функций (см. Ниже), но kwargs сам по себе является просто dict.

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 называется.

Я использовал * args здесь, потому что self.search вызывается без аргументов или одного аргумента.

Когда вы говорите

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

self.search() вызываются без Аргументов, когда кнопка нажата. Но когда вы говорите

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

self.search(event) вызывается с одним аргументом при нажатии клавиши Return. event - это Tkinter.Event, который имеет атрибуты (время, состояние, тип, виджет, x, y и т. Д.), Которые позволяют вам узнать больше о том, какое событие имело место.

Другие, возможно, лучше, способ определить search бы

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

Это было бы ясно дало понять, что search может быть передан 0 или 1 аргументы, а не просто и произвольное числом аргументов. Это также обеспечило бы более легкий доступ к event, если событие было отправлено до search.

Ссылка:

+0

Спасибо, теперь это более понятно для меня. Просто спросите, что стоит за этими словами: «** kwargs и * args»? – Thomas

+0

Я добавил объяснение, почему я использовал '** kwargs' и' * args'. Если это слишком долго читать, см. Объяснение соляной краской (http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/). – unutbu

Смежные вопросы