Ваш код выглядит нормально, но обратите внимание, что фокус должен быть на кнопке, если вы хотите, чтобы 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
.
Ссылка:
Спасибо, теперь это более понятно для меня. Просто спросите, что стоит за этими словами: «** kwargs и * args»? – Thomas
Я добавил объяснение, почему я использовал '** kwargs' и' * args'. Если это слишком долго читать, см. Объяснение соляной краской (http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/). – unutbu