Python 如何从tkinter button press函数传递参数并获取返回值?

Python 如何从tkinter button press函数传递参数并获取返回值?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在尝试将fieldexp_文本框中输入的单词作为参数传递给functiondefinition。 以下是字典应用程序的代码。 json文件是一个包含单词及其含义的python字典。我有办法做到这一点吗 import tkinter import json import difflib data = json.load(open('data.json')) main_window = tkinter.Tk() def definition(w): w = w.lower()

我正在尝试将fieldexp_文本框中输入的单词作为参数传递给functiondefinition。 以下是字典应用程序的代码。 json文件是一个包含单词及其含义的python字典。我有办法做到这一点吗

import tkinter
import json
import difflib

data = json.load(open('data.json'))

main_window = tkinter.Tk()


def definition(w):
    w = w.lower()
    match_word = difflib.get_close_matches(w, data.keys())
    if w in data:
        result = data[w]
        return result
    elif len(match_word) > 0:
        answer = input(f"Did you mean '{match_word[0]}'? [Y/N]").upper()
        if answer == 'Y':
            result = data[match_word[0]]
            return result
        elif answer == 'N':
            return f"'{w}' is not in my dictionary"
        else:
            return 'command not understood'
    else:
        return f"'{w}' is not in my dictionary"


# Window Title
main_window.title('Dictionary')
main_window.geometry('320x320')

# Expression Frame
exp_frame = tkinter.Frame(main_window)
exp_frame.grid(row=0, column=0, columnspan=3, sticky='new')
exp_label = tkinter.Label(exp_frame, text='Enter your Word Here: ')
exp_label.grid(row=0, column=0)
下面字段中提供的单词应作为参数传递给functiondefinition

exp_textbox = tkinter.Entry(master=exp_frame)
exp_textbox.grid(row=0, column=1)
exp_label = tkinter.Button(exp_frame, text='Search', command=definition(exp_textbox.get()))
exp_label.grid(row=0, column=3)

# Definition Frame
def_frame = tkinter.Frame(main_window)
def_frame.grid(row=2, column=0, columnspan=3, sticky='new')
def_label = tkinter.Label(def_frame, text='Definition is : ')
def_label.grid(row=2, column=0)
然后,函数的返回值将在此处为用户返回

def_textbox = tkinter.StringVar()
tkinter.Entry(def_frame, textvariable=def_textbox).grid(row=2, column=1)
main_window.mainloop()

因此,有几个问题是显而易见的

在按下按钮时运行该功能 第一个问题是,在创建按钮时,您会立即运行定义函数,而不是仅在按下按钮时运行它。对此问题有一些解决方案,但简单的补充是:

exp_label = tkinter.Button(exp_frame, text='Search', command=lambda: definition(exp_textbox.get()))
获取运行函数的结果 下一个问题是,您将检查定义的结果返回到Button对象的调用点,而Button对象不知道如何处理它。解决此问题的一种快速方法是直接在函数本身的文本框中设置值:

将def_文本框Stringvar的定义移到按钮上方 将def_文本框传递给按钮命令 使用set更改文本框,而不是返回结果 给出最终代码,如:

import tkinter
import json
import difflib

data = json.load(open('data.json'))

main_window = tkinter.Tk()

def definition(w, txtbox):
    print(f'In definition with {w}')
    w = w.lower()
    match_word = difflib.get_close_matches(w, data.keys())
    if w in data:
        result = data[w]
        txtbox.set(result)
    elif len(match_word) > 0:
        answer = input(f"Did you mean '{match_word[0]}'? [Y/N]").upper()
        if answer == 'Y':
            result = data[match_word[0]]
            txtbox.set(result)
        elif answer == 'N':
            txtbox.set(f"'{w}' is not in my dictionary")
        else:
            txtbox.set('command not understood')
    else:
        txtbox.set(f"'{w}' is not in my dictionary")


# Window Title
main_window.title('Dictionary')
main_window.geometry('320x320')

def_textbox = tkinter.StringVar()
# Expression Frame
exp_frame = tkinter.Frame(main_window)
exp_frame.grid(row=0, column=0, columnspan=3, sticky='new')
exp_label = tkinter.Label(exp_frame, text='Enter your Word Here: ')
exp_label.grid(row=0, column=0)

exp_textbox = tkinter.Entry(master=exp_frame)
exp_textbox.grid(row=0, column=1)
exp_label = tkinter.Button(exp_frame, text='Search', command=lambda: definition(exp_textbox.get(), def_textbox))
exp_label.grid(row=0, column=3)

# Definition Frame
def_frame = tkinter.Frame(main_window)
def_frame.grid(row=2, column=0, columnspan=3, sticky='new')
def_label = tkinter.Label(def_frame, text='Definition is : ')
def_label.grid(row=2, column=0)

tkinter.Entry(def_frame, textvariable=def_textbox).grid(row=2, column=1)
main_window.mainloop()

这回答了你的问题吗?请尝试为这个问题添加一个有意义的标题。现在的标题毫无意义。