2013-12-04 2 views
0

У меня есть пара определенных функций, которые я хочу создать для кнопок в моем графическом интерфейсе. Пара этих функций требует один или два аргумента (числа), и это то, что вызывает проблемы для меня. Я подумал о комбинации между кнопкой и записью, где, когда я нажимаю на определенную кнопку (для одной из моих функций), появляется запись, в которой я печатаю число. Затем, когда я нажимаю кнопку ввода, я хочу, чтобы этот номер использовался в качестве аргумента для функции, привязанной к моей кнопке, и затем должна выполняться функция.Кнопка Tkinter и запись

1 функция Я хочу, чтобы привязать к кнопке:

def move(power, tacho_units): 
    MOTOR_CONTROL.cmd(5, power, tacho_units, speedreg=0, smoothstart=1, brake=0) 
    is_ready(5) 

Мы работаем с Lego Mindstorms, поэтому Im довольно уверен, что, например, выше функция может быть немного запутанным для некоторых людей.

from Tkinter import * 

class App: 

    def __init__(self, master): 

     frame = Frame(master) 
     frame.pack() 

     self.button = Button(frame, text="Move", command=!_______!) 
     self.button.pack(side=LEFT) 

root = Tk() 

app = App(root) 

root.mainloop() 

root.destroy() 

У кого-то есть предложения/решения для меня? Буду признателен, если кто-то сможет мне помочь. Создать функцию (которая откроет новое окно с записью), которую я вызываю, когда я нажимаю кнопку «Переместить»? Числа (power и tacho_units в этой функции), которые я ввожу в запись, - это то, что я хочу использовать для функции Move, когда я нажимаю enter.

+2

Включите в свой вопрос код. – sPaz

+1

У меня есть одно предложение - показать код. – furas

ответ

0

Используйте lambda функцию, чтобы назначить функцию с аргументами

some_power = ... # set value 
some_tacho_units = ... # set value 

self.button = Button(frame, text="Move", command=lambda a=some_power,b=some_tacho_units:move(a, b)) 

или

self.button = Button(frame, text="Move", command=lambda:move(5, 10)) 
0

Как правило, способ передать аргументы функции, связанной с виджетом, чтобы использовать lambda или functools.partial (примечание: это не только пути). Оба эти являются несколько продвинутыми темами, но если вы просто следуете примеру, вполне безопасно использовать их, не понимая их полностью.

Вот пример использования лямбда:

b = tk.Button(..., command=lambda power=1, tacho_units="x": move(power, tacho_units) 

Хотя технически правильно, просто думать о лямбда как «DEF», но без имени. Он принимает аргументы и может вызывать функции.

Вот то же самое, используя functools.partial:

b = tk.Button(..., command=functools.partial(move, power=1, tacho_units="x")) 

Примечание: Вы должны добавить оператор импорта для functools.

functools.partial по сути копирует функцию (в данном случае, перемещает) и предоставляет значения по умолчанию для аргументов. Таким образом, когда вы вызываете его без аргументов (по умолчанию tkinter), параметры будут иметь эти значения по умолчанию.

ОДНАКО ...

Часто это проще написать функцию для вызова вашей функции. Цель этой дополнительной функции - собрать входы - предположительно, из других виджетов - и затем вызвать окончательную функцию. Например:

def do_move(): 
    power = power_input.get() 
    tacho_units = tacho_input.get() 
    move(power, tacho_units) 

b = tk.Button(..., command=do_move) 

Используете ли вы этот третий метод, зависит от того, откуда взялись значения аргументов. Если вы знаете значения на момент создания виджета, используя lambda или functools.partial, вы можете вставлять аргументы прямо там.Если вы собираетесь получать параметры из других виджетов, предпочтительна третья форма.

+0

Спасибо за ответ! Поскольку мощность и tacho_units не будут одинаковыми каждый раз, я пойду на третье предложение. Допустим, что я хочу получить мощность и tacho_units из виджета. Я думал о том, когда я нажму кнопку перемещения, откроется запись. И когда я ввожу аргументы для функции move и нажимаю enter, эти аргументы будут использоваться с функцией move. Поскольку я новичок в tkinter, я понятия не имею, как я могу это написать. Это хороший способ, или есть ли более простые/лучшие решения? – user3067156

+0

@ user3067156: не зная больше о вашей полной программе, невозможно сказать, что является лучшим способом. Поскольку я лично считаю, что диалоги - плохой дизайн пользовательского интерфейса, для меня лучшим способом было бы иметь виджеты ввода в главном окне, поэтому сначала нужно ввести значения, а затем - нажать «переместить». Это только мое мнение, это не объективно лучшее решение. –

+0

Что-то для меня хорошо, пока я получаю это, чтобы работать :) Если у меня есть входные виджеты в моем главном окне. Как подключить виджет ввода с помощью моей кнопки? Извините за все вопросы, но я застрял в этом несколько дней, и я понятия не имею, как решить это самостоятельно. – user3067156

Смежные вопросы