我定义了GCanvas,它是Canvas的扩展。我的目的是在类级别绑定到GCanvas。它不起作用。
我也尝试绑定到tk.Canvas,它也不起作用。绑定到FormBuilder
或GCanvas实例可以正常工作。 (这些替代方案对我来说都没有用,但我只是试着看看发生了什么。)运行OS X,El Capitan。
root
答案 0 :(得分:5)
" class" in Toplevel
指的是tk库使用的内部类名,而不是python类名。更准确地说,在这种情况下,它引用了一个绑定标记,它恰好与tk类同名,它也恰好与核心Tkinter类之一同名(例如: Canvas
,GCanvas
等。)
要在类级别绑定到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"))