如何在python Tkinter中使用lambda将Entry.get设置为命令函数的参数

时间:2016-11-15 18:03:35

标签: python button lambda tkinter tkinter-entry

我的应用程序有一个输入字段和一个按钮:

    from subprocess import *
    from Tkinter import *


    def remoteFunc(hostname):
            command = 'mstsc -v {}'.format(hostname)
            runCommand = call(command, shell = True)
            return

    app = Tk()
    app.title('My App')
    app.geometry('200x50+200+50')

    remoteEntry = Entry(app)
    remoteEntry.grid()

    remoteCommand = lambda x: remoteFunc(remoteEntry.get()) #First Option
    remoteCommand = lambda: remoteFunc(remoteEntry.get()) #Second Option

    remoteButton = Button(app, text = 'Remote', command = remoteCommand)
    remoteButton.grid()

    app.bind('<Return>', remoteCommand)

    app.mainloop()

我希望当我将ip / computer名称插入到输入字段时,它会将其作为参数发送到按钮的命令,所以当我按Return或按下按钮时,它将远程使用该名称的计算机/ IP。

当我使用第一个选项执行此代码时(查看代码),只有我按下Return键,如果我按下按钮,这就是错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1532, in __call__
return self.func(*args)
TypeError: <lambda>() takes exactly 1 argument (0 given)

如果我尝试按下remoteCommand的第二个选项,只有当我尝试按下按钮它工作但我按下返回键我得到这个错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1532, in __call__
return self.func(*args)
TypeError: <lambda>() takes no arguments (1 given)

两者之间的唯一区别是lambda是否得到一个参数。

2 个答案:

答案 0 :(得分:1)

我认为最好的解决方案是不使用lambda。应该避免使用IMO,lambda,除非它确实是问题的最佳解决方案,例如需要创建闭包时。

由于您希望从返回键上的绑定调用相同的函数,并且只需单击按钮,编写一个可选择接受事件的函数,然后忽略它:

例如:

id = auth0|582b40627882b2970253725c

答案 1 :(得分:1)

命令不会获得参数。事件处理程序将事件作为参数。要将函数作为两者使用,请使用默认参数。

def remote(event=None):
     remoteFunc(remoteEntry.get())