我正在创建一个需要用户输入的应用程序。代码有一个条目小部件,并且有一个按钮可以调用一个函数,其中一个条目小部件的输入作为参数。但是,每当我打印参数(条目小部件的内容)时,我得到一个空列表而不是我输入的内容。
#!/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()
有谁知道可能导致这种情况发生的原因,或者我的代码可能出现什么问题?
答案 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对它有有效的批评......但对于像这样简单的东西他们工作正常