Привязка к кнопке работает не так, как ожидалось
я связал событие <Return>
к кнопке, думая, что это вызовет command
для запуска после нажатия Enter:
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
выполняется, если Enter нажата?
1 ответов
ваш код выглядит нормально, но обратите внимание, что фокус должен быть на кнопке, если вы хотите Return
называть self.search()
. Вы можете изменить фокус с виджета на виджет, нажав Tab
. Виджет в фокусе очерчен тонкой черной линией. Возможно, вам придется нажать Tab
один или несколько раз, чтобы переместить фокус на кнопку, прежде чем нажать Return
.
если вы хотите Return
для работы в любом месте окна GUI, а затем изменить
self.button1.bind('<Return>', self.search)
to
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
сам по себе просто дикт.
kwargs
затем перешел в Frame
:
frame = tk.Frame(master, **kwargs)
теперь, когда **kwargs используется в вызове функции, пары ключ-значение в kwargs
dict расширяется так, чтобы приведенный выше вызов функции был эквивалентен
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()
вызывается без argumens при нажатии кнопки. Но когда вы говорите
button.bind('<Return>', self.search)
self.search(event)
вызывается с одним аргументом, когда Return
клавиша нажата. event
это Tkinter.Событие который имеет атрибуты (время, состояние, тип, виджет, x, y и т. д.), которые позволяют узнать больше о том, какое событие произошло.
другой, возможно, лучший, способ определить search
будет были
def search(self, event = None):
...
это дало бы понять, что search
может быть передано 0 или 1 аргументов, а не просто и арбитр количество аргументов. Это также обеспечило бы более легкий доступ к event
если событие было передано search
.
ссылки: