functools.partial没有传递Tkinter参数

时间:2015-07-17 17:49:46

标签: python tkinter

我正在创建一个需要用户输入的应用程序。代码有一个条目小部件,并且有一个按钮可以调用一个函数,其中一个条目小部件的输入作为参数。但是,每当我打印参数(条目小部件的内容)时,我得到一个空列表而不是我输入的内容。

#!/usr/bin/env python

import grammar 
import shelve
from functools import partial
from Tkinter import *
def call_response(text):
    print text
    grammar.analyze.analyze(text)

class MainWindow(Tk):
    def new_object(self):
        main_frame = Frame(self)
        bottom_frame = Frame(self)
        main_frame.pack()
        bottom_frame.pack(side=BOTTOM)
        output = Text(main_frame)
        output.pack()
        input_entry = Entry(bottom_frame, width=50)
        input_entry.grid(row=1, column=1)
        send_input_button = Button(bottom_frame, text='Chat!', command=partial(
             call_response, input_entry.get().split()))
        send_input_button.grid(row=1, column=2)
        mainloop()

root = MainWindow()
root.new_object()

有谁知道可能导致这种情况发生的原因,或者我的代码可能出现什么问题?

3 个答案:

答案 0 :(得分:3)

创建按钮时,您将获取一次条目; partial() not 执行用于在调用自身时创建参数的表达式; input_entry.get().split()表达式首先执行 ,结果将传递给正在创建的partial()对象。

在此处使用lambda可在单击按钮时执行entry.get()

send_input_button = Button(bottom_frame, text='Chat!', command=lambda:
     call_response(input_entry.get().split()))

答案 1 :(得分:3)

call_response应该是IMHO类的一部分,可以消除这些问题。

    self.input_entry = Entry(bottom_frame, width=50)
    send_input_button = Button(bottom_frame, text='Chat!', command=self.call_response)

def call_response(self):
    text=self.input_entry.get().split()
    grammar.analyze.analyze(text)

答案 2 :(得分:1)

或者只是将其更改为

def call_response(text_fn):
    text = text_fn().split()
    print text
    grammar.analyze.analyze(text)
....

      send_input_button = Button(bottom_frame, text='Chat!', command=partial(
         call_response, input_entry.get))

如果你真的想要避免lambda ......作为另一种选择...但lambda很好@AlexMarteli对它有有效的批评......但对于像这样简单的东西他们工作正常