Предположим, что у меня есть 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()
Насколько я знаю от сохраненного proc, Вы не можете сделать этого. Можно, однако, определить имена, как только Вы получили DataSet и затем используете их с тех пор.
ds.Tables[0].TableName = "NametbA";
Есть ли какая-либо причина, которую Вы не можете назвать ими вручную в честь заполнения DataSet?
mySqlDataAdapter.Fill(ds);
ds.Tables[0].TableName = "NametbA";
ds.Tables[1].TableName = "NametbB";
я не знаю ни о каком способе назвать DataTables, которые возвращаются как часть нескольких наборов результатов из хранимой процедуры, но если Вы знаете то, что сохраненный proc возвращает тогда вручную, именование их должно хорошо работать.
Редактирование
Знание, что Вы управляете хранимой процедурой, одна альтернатива, могло бы быть должно добавить столбец к наборам результатов, который представляет имя таблицы. Тогда Вы могли бы быть в состоянии сделать что-то как:
foreach (DataTable table in ds.Tables)
{
table.TableName = table.Rows[0]["TableName"].ToString();
}
Однако это полагается на наборы результатов, возвращающиеся из хранимых процедур, на самом деле содержащих строки. Если бы они не содержат строки тогда, необходимо было бы обернуть его в, "если" оператор и не каждая таблица получит имя.
У меня это работает, но мне нужна дополнительная работа, чтобы получить ожидаемые имена таблиц:
Dim tableCount As Integer = 3
Dim tables(tableCount) As DataTable
tables(0) = (New DataTable("Employee"))
tables(1) = (New DataTable("Manager"))
tables(2) = (New DataTable("Department"))
dsUControlData.Tables.Add(tables(0))
dsUControlData.Tables.Add(tables(1))
dsUControlData.Tables.Add(tables(2))
'Fill required tables
da.Fill(0, 0, tables)
Return dsUControlData