从类内部绑定小部件

时间:2011-02-05 17:38:56

标签: python tkinter

我在这个主题上看到的每个例子都显示一个Button被绑定到一个命令,除了Button小部件是在一个类之外创建的:

e.g:

from Tkinter import *

root = Tk()

def callback(event):
    print "clicked at", event.x, event.y 

frame = Frame(root, width=100, height=100) 
frame.bind("<Button-1>", callback) 
frame.pack()

root.mainloop()

现在没关系,除了我在尝试执行以下操作时遇到错误:

from Tkinter import *
class App():
    def __init__(self,parent):
        o = Button(root, text = 'Open', command = openFile)
        o.pack()
    def openFile(self):
        print 'foo'


root = Tk()
app = App(root)
root.mainloop()

用“command = self.openFile()”或“command = openFile()”替换“command = openFile”也不起作用。

如何将函数绑定到类中的Button?

2 个答案:

答案 0 :(得分:5)

command = self.openFile

如果键入command = self.openFile(),则实际调用该方法并将返回值设置为命令。在没有括号的情况下访问它(就像在非类版本中一样)可以获得实际的方法对象。您需要前面的self.,否则Python会尝试从全局命名空间中查找openFile

App.openFileself.openFile之间的区别在于后者绑定到特定实例,而第一个需要在稍后调用时提供App的实例。 Python Data Model document包含有关绑定和未绑定方法的更多信息。

答案 1 :(得分:1)

如果事件处理程序声明是:

def handler(self):

应该是:

def handler(self,event):

这是因为 tk.bind()event 作为隐式参数插入到处理程序中。无论 event_handler 方法是在类中还是外部,都会发生这种情况。在一个类中,python 自己添加了 self 对象。

有时,简单往往会掩盖现实。