Предположим, что у меня есть 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
что-то при нажатии кнопки I необходимо установить:
btn['command'] = print # default to print is new line
Обратите внимание на недостаток в ()
с помощью метода print
, который опущен в том смысле, что: " Это имя метода, которое я хочу, чтобы вы вызывали при нажатии, но не вызываете его именно в этот момент ». Однако я не передал никаких аргументов для print
, поэтому он печатал все, что он печатает, когда без аргументов.
W ith Аргумент (ы)
Теперь Если бы я хотел также передать аргументы методу, который я хочу называть при нажатии кнопки, я мог бы использовать анонимные функции, которые могут быть созданы с помощью оператора lambda , в этом случае для встроенного метода 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
С Аргумент (s)
Чтобы передать аргумент (ы) методу, который вызывает другие методы, снова используйте инструкцию 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()
DF %>% group_by(Grp) %>%
mutate(Dist = colMeans(as.matrix(dist(cbind(x, y)))))
# # A tibble: 20 x 5
# # Groups: Grp [4]
# Item Grp x y Dist
# <fctr> <int> <dbl> <dbl> <dbl>
# 1 a 1 -0.197904299 0.363086055 0.4659160
# 2 b 1 0.090540444 -0.006314185 0.2031230
# 3 c 1 0.101018893 -0.025062949 0.2011672
# 4 d 1 0.006358616 -0.149784267 0.2323359
# 5 e 1 0.219596250 -0.341440596 0.3605274
# 6 f 2 -0.493124602 -0.002935820 0.5155365
# ...
Чтобы узнать, как это работает, начните с одного подмножества данных и перейдите по частям:
# run these one line at a time and have a look at ?dist
dd = DF[DF$Grp == "1", c("x", "y")]
dist(dd)
as.matrix(dist(dd))
colMeans(as.matrix(dist(dd)))