Python 发出GUI onclick命令时,将变量值从一个模块返回到另一个模块的问题
我正在编写一个小的字典程序,用户可以打开另一个窗口来添加一个新词和定义,这样就可以将它添加到主字典中,并在以后进行搜索 我的问题是,尽管用户可以打开一个新窗口来添加单词及其定义,但当单击submit按钮时,主词典不会更新。相反,它会抛出一个错误,Python 发出GUI onclick命令时,将变量值从一个模块返回到另一个模块的问题,python,variables,user-interface,dictionary,Python,Variables,User Interface,Dictionary,我正在编写一个小的字典程序,用户可以打开另一个窗口来添加一个新词和定义,这样就可以将它添加到主字典中,并在以后进行搜索 我的问题是,尽管用户可以打开一个新窗口来添加单词及其定义,但当单击submit按钮时,主词典不会更新。相反,它会抛出一个错误,UnboundLocalError:赋值前引用的局部变量“word” 我似乎在将新单词/定义变量值传回主程序时遇到问题 主程序代码(文件名:Libraryv2.py) 编辑窗口模块(文件名为libraryentry.py): 在解决这些问题上的任何帮助都
UnboundLocalError:赋值前引用的局部变量“word”
我似乎在将新单词/定义变量值传回主程序时遇到问题
主程序代码(文件名:Libraryv2.py)
编辑窗口模块(文件名为libraryentry.py):
在解决这些问题上的任何帮助都将受到感激。为什么我的新词/定义没有正确地传递回主程序
非常感谢
word = libraryentry.main(word)
执行libraryentry.main(word)
没有意义,因为word
还不存在,而且main
也不接受任何参数
word = libraryentry.main()
现在您将获得NameError:name'word'未在libraryentry
中定义,因为您在第二个窗口出现之前返回(word,definition)
,因此用户输入单词并单击“提交”的可能性为0%。将返回
移动到函数末尾
window.mainloop()
return (word, definition)
现在您将看到NameError:name'entry1'未在click2
中定义,因为在一个函数中定义的变量在另一个函数中不可见。重构libraryentry
以使用类,因此self
的属性可以在方法之间共享
from tkinter import *
class DefinitionWindow(Toplevel):
def __init__(self, root, click_callback):
Toplevel.__init__(self, root)
self.click_callback = click_callback
self.title("Library entry")
#Create the Label
Label(self, text="Enter the word you want to add:").grid(row=0, column=0, sticky=W)
#create entry box
self.word_entry=Entry(self, width=20, bg="light green")
self.word_entry.grid(row=1, column=0, sticky=W)
#create second label
Label(self, text="\nDefinition").grid(row=2, column=0, sticky=W)
#create entry box
self.definition_entry = Entry(self, width=50, bg="light green")
self.definition_entry.grid(row=3, column=0, sticky=W)
#create submit button
Button(self, text="Submit", width=5, command=self.clicked).grid(row=4, column=0, sticky=W)
def clicked(self):
self.click_callback(self.word_entry.get(), self.definition_entry.get())
self.destroy()
除了OO结构之外,请注意没有返回单词和定义的main
。这是由于Tkinter的异步性质-如果main
等待定义窗口关闭,则window.mainloop
无法继续执行,所有内容都将挂起。因此,有必要注册一个回调,一旦用户做出选择,回调将在将来某个时候执行
def clickentry():
def definition_submitted(word, definition):
my_glossary[word] = definition
definition_window = libraryentry.DefinitionWindow(window, definition_submitted)
结果:
您可以使用word=libraryentry.main(word)
,但是libraryentry.main
不接受任何参数。另外,在您的第二个代码块中,window.mainloop()
将永远不会执行,因为函数一到达return
语句就会停止。非常感谢您抽出时间,很抱歉没有早点回来。回答得很好!!!刚开始工作并尝试了您的建议,但现在每次按下“输入新定义”按钮时,我都会遇到以下错误:Tkinter回调回溯中的异常(最近一次调用):文件“C:\Program Files(x86)\Python32\lib\Tkinter_init_uuuuuu.py”,第1399行,在call return self.func(*args)文件中“H:\Departments\COMPUTER STUDIES\3 A级计算课程\F452\Programming Examples\GUI\Dictionary Program\Libraryv3.py”,第20行,在clickentry definition\u window=libraryentryv2.definition window(window,definition\u submitted)文件中”H:\Departments\COMPUTER STUDIES\3高级计算课程\F452\Programming Examples\GUI\Dictionary Program\libraryentryv2.py”,第6行,在init-Tk.\uuuuu-init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(self,*args,**kargs)文件“C:\Program Files(x86)\Python32\lib\tkinter\uu(屏幕名、基本名、类名、交互、wantobjects、useTk、同步、使用)TypeError:必须是str或None,而不是Tk该错误表示调用Toplevel.\uuu init\uuuu
时,函数作为Tk
的第二个参数传入了。我在编写此答案时粘贴了错误版本的定义窗口。对此表示抱歉。我已编辑了支持回调的版本。
from tkinter import *
class DefinitionWindow(Toplevel):
def __init__(self, root, click_callback):
Toplevel.__init__(self, root)
self.click_callback = click_callback
self.title("Library entry")
#Create the Label
Label(self, text="Enter the word you want to add:").grid(row=0, column=0, sticky=W)
#create entry box
self.word_entry=Entry(self, width=20, bg="light green")
self.word_entry.grid(row=1, column=0, sticky=W)
#create second label
Label(self, text="\nDefinition").grid(row=2, column=0, sticky=W)
#create entry box
self.definition_entry = Entry(self, width=50, bg="light green")
self.definition_entry.grid(row=3, column=0, sticky=W)
#create submit button
Button(self, text="Submit", width=5, command=self.clicked).grid(row=4, column=0, sticky=W)
def clicked(self):
self.click_callback(self.word_entry.get(), self.definition_entry.get())
self.destroy()
def clickentry():
def definition_submitted(word, definition):
my_glossary[word] = definition
definition_window = libraryentry.DefinitionWindow(window, definition_submitted)