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

tkinter使用bind绑定事件时调用函数提示NameError该如何解决?

问题原因及解决方案
  • 实例方法调用缺失self前缀

open_numeric_keyboard是Main类的成员方法,在类内部调用类成员必须加self.前缀,否则Python会默认在全局作用域查找对应函数,自然就抛出NameError未定义的报错。

  • bind方法的回调参数不能直接加括号执行

bind方法要求第二个参数是可调用对象,事件触发时才会执行该对象。如果直接写open_numeric_keyboard(0),代码运行到这一行就会立刻执行该函数,而不是点击输入框时才触发,执行结果会作为回调传给bind,不符合要求。如果需要给回调传自定义参数,用lambda匿名函数包装即可。

修正后的代码
from tkinter import *


class Main:
    def __init__(self):
        self.entry_widget = 0

        self.root = Tk()
        self.root.resizable(width=False, height=False)
        self.root.geometry("800x480")
        self.width = 480
        self.height = 480
        # 注意:你原代码用到了self.numeric_frame,这里需要先初始化该组件,否则后续调用tkraise会报AttributeError
        # 示例:self.numeric_frame = Frame(self.root) 自行补充对应布局逻辑
        self.main_frame()


    def main_frame(self):
        self.f_main = Frame(self.root, height = 480, width = 320, borderwidth = 1, highlightbackground="red",highlightthickness=1)
        self.f_main.place(x=480, y=0)

        eF = Entry(self.f_main, relief = "groove")
        eMM = Entry(self.f_main, relief = "groove")

        eF.place(x = 70, y = 127, height = 40, width = 60)
        eMM.place(x = 70, y = 166, height = 40, width = 60)

        # 修正后的绑定代码,lambda接收bind自动传入的event参数,再调用你的实例方法
        eF.bind("<1>", lambda event: self.open_numeric_keyboard(0))    #open numeric for feedrate
        eMM.bind("<1>", lambda event: self.open_numeric_keyboard(1))   #open numeric for MM
        self.root.mainloop() # 补充主循环,否则窗口会直接退出

    def open_numeric_keyboard(self, entry):
        # self.numeric_frame.tkraise() # 请先完成self.numeric_frame的初始化
        if entry == 0:      #F
            self.entry_widget = 0

        elif entry == 1:    #MM
            self.entry_widget = 1

app = Main()

内容的提问来源于stack exchange,提问作者jan havel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:54:03