Python 如何从tkinter button press函数传递参数并获取返回值?
我正在尝试将fieldexp_文本框中输入的单词作为参数传递给functiondefinition。 以下是字典应用程序的代码。 json文件是一个包含单词及其含义的python字典。我有办法做到这一点吗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()
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()
这回答了你的问题吗?请尝试为这个问题添加一个有意义的标题。现在的标题毫无意义。