Python新建窗口功能开发:解决提交函数无法识别新窗口控件的NameError问题
问题原因
你遇到的NameError本质是作用域问题:question_box、answer_box、correction_box以及当前题目new_question都是playGameClicked函数内部的局部变量,脱离这个函数的作用域后,submitClicked无法直接访问到这些变量。
另外你的原提交函数还有两处语法错误:
- Entry控件的取值用
get()即可,get(0.0, END)是Text控件的取值语法 - 没有获取当前题目内容,也没有对用户输入做类型转换
最小改动解决方案
通过lambda闭包将需要的控件和当前题目作为参数传递给提交函数,无需改动整体代码结构:
- 修改
submitClicked函数定义,接收传入的参数:
def submitClicked(question_box, answer_box, correction_box, current_question): user_answer = answer_box.get().strip() correct = False try: # 取当前题目的正确答案,和用户输入的整数比对 right_answer = all_tables_dict[current_question] if int(user_answer) == right_answer: correct = True except: pass # 先清空原有提示再写入新结果 correction_box.delete("1.0", END) if correct: correction_box.insert(END, "CORRECT!") else: correction_box.insert(END, "INCORRECT!")
- 修改
playGameClicked中提交按钮的绑定逻辑,传入需要的变量:
把原来的
submit_btn = Button(newWindow,text="Submit",width=10,command=submitClicked)
替换为
submit_btn = Button(newWindow,text="Submit",width=10,command=lambda: submitClicked(question_box, answer_box, correction_box, new_question))
其他可选方案
- 全局变量方案:在
playGameClicked内部将question_box、answer_box、correction_box、new_question声明为global全局变量,提交函数直接访问即可,但多窗口场景下容易出现变量冲突,不推荐。 - 类封装方案:将整个乘法口诀游戏封装为独立类,所有控件和状态都作为类的实例属性,完全规避作用域问题,适合功能复杂的多窗口场景。
内容的提问来源于stack exchange,提问作者fran
相关产品推荐
相关产品推荐

