2015-07-17 2 views
0

Я создаю приложение, которое требует ввода от пользователя. В коде есть виджет ввода, и есть кнопка, которая вызывает функцию с вводом одного из виджетов записи в качестве аргумента. Однако всякий раз, когда я печатаю аргумент (содержимое виджета ввода), я получаю пустой список вместо того, что я ввел.functools.partial не передает аргумент 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

При создании кнопки вы выбираете запись ; a partial() делает не выполняет выражения, которые вы использовали для создания аргументов при его вызове; выражение input_entry.get().split() выполнено первым, и результат передается на создаваемый объект partial().

Используйте lambda здесь, чтобы иметь entry.get() выполняется при нажатии на кнопку:

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

Ах, я вижу, Дело в том, на вопрос, который я задал время назад, мне сказали, чтобы остаться как можно дальше от лямбды, как я возможно мог, так вот почему я хотел, чтобы избежать их использования. http://stackoverflow.com/questions/27996218/how-can-i-execute-more-a-command-based-on-the-button-that-called-it-classes-an –

+2

Использование Python для по крайней мере, до тех пор, пока Алекс Мартелли, я откровенно не рассказываю о нем. Когда вам нужно закрытие, вам нужно закрыть, а затем лямбда просто проще. –

+0

Лично я бы тоже избегал лямбда. Lambdas - прекрасный инструмент для определенных проблем, но они должны использоваться для решения определенной проблемы, а не как стандартная практика IMHO. Я бы создал метод класса, который может вызвать команда. Этот метод может затем получить значение и сделать все, что ему нужно. По моему опыту, использование метода облегчает поддержку и отладку кода. –

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 в порядке @AlexMarteli имеет действительную критику этого ... но для чего-то простого, как это, они отлично работают

3

call_response should быть частью класса 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) 
+0

да, я согласен с этим ... хороший ответ :) –

Смежные вопросы