Tkinter, вызывающий функцию с аргументами
Недавно я закончил простую командную строку Othello, и теперь я пытаюсь создать для нее графический интерфейс. Моя мысль заключалась в том, что я буду нажимать рамку в сетке 8 на 8 и что это вызовет мою функцию place_tile (метод) с координатами кадров. Мне также удалось вызвать функции вызова, которые требуют аргументов с кнопками, но у меня возникают проблемы, когда дело доходит до фреймов. Кто-нибудь есть идея, что я делаю неправильно или, может быть, лучший способ сделать это?
Пример кода, который работает:
from tkinter import * root = Tk() def hello(word): print(word) def bye(event): print("Bye") background = Frame(root, height=100, width=100) background.bind("<Button-1>", bye) button = Button(root, text="Bye", command=lambda:hello("Hi")) button.pack() background.pack() root.mainloop()
Спасибо, что я хочу сделать что-то вроде функции hello из фрейма, например, фона.
- Как реализовать простую кнопку в PyQt
- Объект 'NoneType' не имеет атрибута 'config'
- Команда Tkinter назначить кнопку в цикле с лямбдой
Вы можете использовать аргументы по умолчанию для лямбда-функции, пример –
def dummy(frameobj): pass background = Frame(root, height=100, width=100) background.bind("<Button-1>", bye) button = Button(root, text="Bye", command=lambda frameobj=background:hello(frameobj))
Когда будет вызываться лямбда, она будет вызвана без каких-либо аргументов, поэтому будут использоваться значения по умолчанию, которые были указаны.
Если вы хотите передать аргументы функциям, используемым в bind()
, вам также необходимо включить аргумент event
который автоматически передается tkinter. Пример –
def bye(event, frameobj): print("Bye") background = Frame(root, height=100, width=100) background.bind("<Button-1>", lambda event, frameobh=background: bye(event,frameobj))
Но все, что вам нужно, это объект Frame
из которого вызывается метод bye()
, вы можете легко получить это, используя переменную события, которая передается tkinter – event.widget
. Пример –
def bye(event): frameobj = event.widget print("Bye") background = Frame(root, height=100, width=100) background.bind("<Button-1>", bye)
- Автоматически определять Xpath из заданного пользователем элемента в качестве входного
- Как получить текст, который пользователь набрал в терминал (но до того, как пользователь нажал кнопку ввода)