Приклад GUI:
Скажімо, у мене є графічний інтерфейс:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
Що відбувається при натисканні кнопки
Дивіться, що при btn
натисканні він викликає власну функцію, яка дуже схожа на button_press_handle
наступний приклад:
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
з:
button_press_handle(btn['command'])
Ви можете просто подумати, що цей command
параметр повинен бути встановлений як, посилання на метод, який ми хочемо викликати, як callback
у button_press_handle
.
Виклик методу (зворотний виклик ), коли натискається кнопка
Без аргументів
Тож якби я хотів print
чогось при натисканні кнопки, мені потрібно було б встановити:
btn['command'] = print # default to print is new line
Зверніть особливу увагу на відсутність в ()
с print
методом , який опускається в тому сенсі , що: «Це ім'я методу, який я хочу вам зателефонувати , коли натиснута , але Не кличте це як раз цей самий момент.» Однак я не передав жодних аргументів для того, print
щоб він надрукував все, що друкує, коли викликається без аргументів.
З аргументом
Тепер, якщо я хотів також передати аргументи методу, якого я хочу викликати, коли натискається кнопка, я міг би скористатися анонімними функціями, які можна створити за допомогою лямбда- оператора, в даному випадку для print
вбудованого методу, як: :
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
Виклик декількох методів при натисканні кнопки
Без аргументів
Ви також можете досягти цього, використовуючи lambda
оператор, але це вважається поганою практикою, і тому я його сюди не включатиму. Доброю практикою є визначення окремого методу, multiple_methods
який викликає потрібні методи, а потім встановлення його як зворотного виклику для натискання кнопки:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
З аргументом
Щоб передати аргументи (аргументи) методу, який викликає інші методи, знову використовуйте lambda
оператор, але спочатку:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
а потім встановіть:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
Повернення об'єктів із зворотного дзвінка
Також зверніть увагу , що в подальшому callback
може на насправді не return
тому , що це тільки називається всередині button_press_handle
з callback()
в протилежність return callback()
. Це робить, return
але не деінде поза цією функцією. Таким чином, вам слід змінити об'єкти, доступні в поточній області.
Повний приклад із глобальними модифікаціями об'єктів
Нижче наведено приклад назвати метод, який змінює btn
текст кожного разу, коли натискається кнопка:
import tkinter as tk
i = 0
def text_mod():
global i, btn # btn can be omitted but not sure if should be
txt = ("Vicariously", "I", "live", "as", "the", "whole", "world", "dies")
btn['text'] = txt[i] # the global object that is modified
i = (i + 1) % len(txt) # another global object that gets modified
root = tk.Tk()
btn = tk.Button(root, text="My Button")
btn['command'] = text_mod
btn.pack(fill='both', expand=True)
root.mainloop()
Дзеркало