对Tkinter bind_class感到困惑

时间:2016-11-04 11:51:12

标签: python-2.7 tkinter tkinter-canvas

我定义了GCanvas,它是Canvas的扩展。我的目的是在类级别绑定到GCanvas。它不起作用。

我也尝试绑定到tk.Canvas,它也不起作用。绑定到FormBuilder或GCanvas实例可以正常工作。 (这些替代方案对我来说都没有用,但我只是试着看看发生了什么。)运行OS X,El Capitan。

root

2 个答案:

答案 0 :(得分:5)

" class" in Toplevel指的是tk库使用的内部类名,而不是python类名。更准确地说,在这种情况下,它引用了一个绑定标记,它恰好与tk类同名,它也恰好与核心Tkinter类之一同名(例如: CanvasGCanvas等。)

要在类级别绑定到GCanvas,最简单的方法是在画布中添加名为class GCanvas(tk.Canvas, object): def __init__(self, master, **kwargs): ... # get the current bind tags bindtags = list(self.bindtags()) # add our custom bind tag before the Canvas bind tag index = bindtags.index("Canvas") bindtags.insert(index, "GCanvas") # save the bind tags back to the widget self.bindtags(tuple(bindtags)) 的绑定标记,如下例所示:

bind_class

然后您可以像这样使用root.bind_class("GCanvas", "<Enter>", GCanvas.enter) root.bind_class("GCanvas", "<Leave>", GCanvas.leave)

{{1}}

有关绑定标记的更多信息,请参阅以下一些其他tkinter问题的答案:

答案 1 :(得分:0)

我发现的一种快速解决方案,用于解决两个 text() 框之间的绑定冲突。 列出绑定标签以对小部件的路径进行排序。列表中的第一次出现。绑定在两个小部件上同时触发。

self.frame2 = Frame(self)
self.frame2.pack()
self.textDomain = Text(self.frame2, width=21, height=10, wrap=WORD, borderwidth=2, relief=GROOVE)
self.textDomain.pack()
self.bindtags = list(self.textDomain.bindtags())
self.textDomain.bind_class(str(self.bindtags[0]), "<Return>", lambda _: self.verifytextBox("textDomain"))
self.textDomain.bind_class(str(self.bindtags[0]), "<Leave>", lambda _: self.verifytextBox("textDomain"))
self.textExtension = Text(self.frame2, width=21, height=10, wrap=WORD, borderwidth=2, relief=GROOVE)
self.textExtension.pack()
self.bindtags = list(self.textExtension.bindtags())
self.textExtension.bind_class(str(self.bindtags[0]), "<Return>", lambda _: self.verifytextBox("textExtension"))
self.textExtension.bind_class(str(self.bindtags[0]), "<Leave>", lambda _: self.verifytextBox("textExtension"))