【问题标题】:How to set Entry.get as an argument of a command function with lambda in python Tkinter如何在 python Tkinter 中使用 lambda 将 Entry.get 设置为命令函数的参数
【发布时间】:2016-11-15 18:03:34
【问题描述】:

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

    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/计算机名称时,它会将其作为参数发送给按钮的命令,因此当我按下 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 的第二个选项它可以工作,但如果按下 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 no arguments (1 given)

两者之间的唯一区别是 lambda 是否获取参数。

【问题讨论】:

    标签: python button lambda tkinter tkinter-entry


    【解决方案1】:

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

    由于您希望通过返回键上的绑定以及单击按钮调用相同的函数,因此请编写一个可选择接受事件的函数,然后简单地忽略它:

    例如:

    def runRemoteFunc(event=None):
        hostname = remoteEntry.get()
        remoteFunc(hostname)
    ...
    remoteButton = Button(..., command = remoteFunc)
    ...
    app.bind('<Return>', remoteCommand)
    

    【讨论】:

      【解决方案2】:

      命令没有参数。事件处理程序将事件作为参数。要将函数同时用作两者,请使用默认参数。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-29
        • 1970-01-01
        • 1970-01-01
        • 2019-12-05
        • 2020-07-23
        • 1970-01-01
        • 2021-01-01
        相关资源
        最近更新 更多