Предположим, что у меня есть 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()
Вы могли сделать это арифметически, не используя строку:
sum = 0;
while (n != 0) {
sum += n % 10;
n /= 10;
}
Я предположил бы, что самое легкое для чтения реализации будет чем-то как:
public int sum(int number)
{
int ret = 0;
foreach (char c in Math.Abs(number).ToString())
ret += c - '0';
return ret;
}
Это работает и довольно легко читать. BTW: Преобразовать. ToInt32 ('3') дает 51, не 3. Преобразовать. ToInt32 ('3' - '0') дает 3.
я предположил бы, что самая быстрая реализация является arithmetric решением Greg Hewgill.
Я люблю ответ chaowman, но сделал бы одно изменение
int result = 17463.ToString().Sum(c => Convert.ToInt32(c));
, я даже не уверен c - '0', синтаксис работал бы? (substracting два символа должен дать символ в результате, я думаю?)
я думаю, что это - самая читаемая версия (использование суммы слова в сочетании с лямбда-выражением, показывающим, что Вы сделаете это для каждого символа). Но действительно, я не думаю, что это будет самым быстрым.
public static int SumDigits(int value)
{
int sum = 0;
while (value != 0)
{
int rem;
value = Math.DivRem(value, 10, out rem);
sum += rem;
}
return sum;
}
int num = 12346;
int sum = 0;
for (int n = num; n > 0; sum += n % 10, n /= 10) ;
Для целых чисел Greg Hewgill имеет большую часть ответа, но забывает объяснять n < 0. Сумма цифр-1234 должна все еще быть 10, не-10.
n = Math.Abs(n);
sum = 0;
while (n != 0) {
sum += n % 10;
n /= 10;
}
Это число является числом с плавающей точкой, другой подход должен быть проявлен, и решение chaowman полностью перестанет работать, когда это поразит десятичную точку.
Я использую
int result = 17463.ToString().Sum(c => c - '0');
, Это использует только 1 строку кода.