Привязка удаленного вызова скрученной матрицы к кнопке ttk приводит к запуску удаленного вызова при запуске клиента

Я использую python и искажаю, чтобы написать программу управления snmp, часть этого требует, чтобы некоторые кнопки на стороне клиента были привязаны к методу удаленного набора snmp, это обрабатывается с помощью перспективного брокера.

for item in devicevars[current+" buttons"]:
    ttk.Label(buttonframe, text=item + ":").grid(column=1, row=i2, sticky=(E))
    ttk.Button(buttonframe,width = 3,textvariable=guivars["%s %s" %(current, 
                                item)],command=remoteButton(current, item)).grid(column=2, row=i2, sticky=(W))
    i2 = i2+1


def remoteButton(dname, value):

    rbutton= pbfactory.getRootObject()
    rbutton.addCallback(lambda object: object.callRemote("SNMP", dname, value))
    rbutton.addErrback(lambda reason: 'error: '+str(reason.value))

Проблема в том, что этот код вызывает срабатывание удаленного метода сразу после запуска клиента. Кто-нибудь знает, почему это происходит?


person David.Pili    schedule 23.10.2012    source источник


Ответы (1)


Параметр command в Tkinter (и, следовательно, также ttk) является вызываемым объектом, который будет вызываться при нажатии кнопки.

Передавая command=remoteButton(...), вы немедленно вызываете remoteButton, а затем передаете его результат как параметр command.

Вместо этого вы хотите передать параметр command, который при запуске вызовет remoteButton.

Вот как это сделать:

ttk.Button(buttonframe,width = 3,
           textvariable=guivars["%s %s" %(current, item)],
           command=lambda: remoteButton(current, item))

Другими словами, вставьте lambda: перед ним, и вы получите функцию, которая вызывает его, а не просто вызывает.

person Glyph    schedule 24.10.2012