Python 发出GUI onclick命令时,将变量值从一个模块返回到另一个模块的问题

Python 发出GUI onclick命令时,将变量值从一个模块返回到另一个模块的问题,python,variables,user-interface,dictionary,Python,Variables,User Interface,Dictionary,我正在编写一个小的字典程序,用户可以打开另一个窗口来添加一个新词和定义,这样就可以将它添加到主字典中,并在以后进行搜索 我的问题是,尽管用户可以打开一个新窗口来添加单词及其定义,但当单击submit按钮时,主词典不会更新。相反,它会抛出一个错误,UnboundLocalError:赋值前引用的局部变量“word” 我似乎在将新单词/定义变量值传回主程序时遇到问题 主程序代码(文件名:Libraryv2.py) 编辑窗口模块(文件名为libraryentry.py): 在解决这些问题上的任何帮助都

我正在编写一个小的字典程序,用户可以打开另一个窗口来添加一个新词和定义,这样就可以将它添加到主字典中,并在以后进行搜索

我的问题是,尽管用户可以打开一个新窗口来添加单词及其定义,但当单击submit按钮时,主词典不会更新。相反,它会抛出一个错误,
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)