我在这个主题上看到的每个例子都显示一个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?
答案 0 :(得分:5)
command = self.openFile
如果键入command = self.openFile()
,则实际调用该方法并将返回值设置为命令。在没有括号的情况下访问它(就像在非类版本中一样)可以获得实际的方法对象。您需要前面的self.
,否则Python会尝试从全局命名空间中查找openFile
。
App.openFile
和self.openFile
之间的区别在于后者绑定到特定实例,而第一个需要在稍后调用时提供App
的实例。 Python Data Model document包含有关绑定和未绑定方法的更多信息。
答案 1 :(得分:1)
如果事件处理程序声明是:
def handler(self):
应该是:
def handler(self,event):
这是因为 tk.bind()
将 event
作为隐式参数插入到处理程序中。无论 event_handler
方法是在类中还是外部,都会发生这种情况。在一个类中,python 自己添加了 self
对象。
有时,简单往往会掩盖现实。