Tkinter Button无法找到回调命令

时间:2016-06-27 23:57:26

标签: python python-3.x tkinter

我正在开发一个程序来读取和解析我正在处理的嵌入式硬件系统的配置文件。我正在尝试使用tkinter和python来创建一个简单的GUI来读取和写入这个文件。我有文件IO和解析大部分工作,但我无法将所有部件与GUI集成。我想从设备中读取信息,然后使用相关信息填充输入字段。我遇到的问题是我不断收到错误

"in initUI
opnBut = Button(butFrm, text="Open", command=openCfg)
NameError: name 'openCfg' is not defined"

如果我将它放在Application类之外,我可以找到该函数但是我无法弄清楚如何引用我更新它们的窗口内的字段。

非常感谢任何帮助。我的代码段包含在下面。

class Application(Frame):
    def openCfg():
    name = getNameFromFile()
    nameEntry.insert(0, name)



    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()


    def initUI(self):
        self.parent.title("Config Reader")
        self.pack(fill=BOTH, expand=True)

        nameFrm = Frame(self)
        nameFrm.pack(fill=X)

        nameLbl = Label(nameFrm, text="Device Name",width=20)
        nameLbl.pack(side=LEFT,padx=5, pady=5)
        nameEntry = Entry(nameFrm)
        nameEntry.pack(fill=X, padx=5, pady=5)

        butFrm = Frame(self)
        butFrm.pack(fill=X)
        opnBut = Button(butFrm, text="Open Cfg", command=openCfg)
        opnBut.pack(fill=X, padx=5,pady=5)

root = Tk()
root.geometry("600x600")

app = Application(root)
app.mainloop()

1 个答案:

答案 0 :(得分:2)

在类名称空间中定义的项目绑定到该类。在这种情况下,您有几个选项......

一个选项是您可以将其设为staticmethod

class Application(Frame):
    @staticmethod
    def openCfg():
        name = getNameFromFile()
        nameEntry.insert(0, name)

然后将按钮绑定为:

opnBut = Button(butFrm, text="Open Cfg", command=self.openCfg)

然而,很少需要静态方法。在这种情况下,我可能只是将openCfg的定义移出课堂并保留其他所有内容:

def openCfg():
    name = getNameFromFile()
    nameEntry.insert(0, name)

class Application(Frame):
    ...

再来看,这可能会为NameError带来nameEntry。你可能想要一流的方法:

class Application(Frame):
    def openCfg(self):
        name = getNameFromFile()
        self.nameEntry.insert(0, name)

当然,当您创建nameEntry时,您需要使其成为Application类的成员。

...
self.nameEntry = Entry(nameFrm)
self.nameEntry.pack(fill=X, padx=5, pady=5)
...