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 из фрейма, например, фона.

Вы можете использовать аргументы по умолчанию для лямбда-функции, пример –

 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)