You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python新建窗口功能开发:解决提交函数无法识别新窗口控件的NameError问题

问题原因

你遇到的NameError本质是作用域问题:question_box、answer_box、correction_box以及当前题目new_question都是playGameClicked函数内部的局部变量,脱离这个函数的作用域后,submitClicked无法直接访问到这些变量。
另外你的原提交函数还有两处语法错误:

  • Entry控件的取值用get()即可,get(0.0, END)是Text控件的取值语法
  • 没有获取当前题目内容,也没有对用户输入做类型转换

最小改动解决方案

通过lambda闭包将需要的控件和当前题目作为参数传递给提交函数,无需改动整体代码结构:

  1. 修改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!")
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:09:01