对 Tkinter 感到困惑 bind_class
Confused about Tkinter bind_class
我定义了GCanvas,Canvas的扩展。我的意图是在 class 级别绑定到 GCanvas。它不起作用。
我也试过绑定到tk.Canvas,但也没用。绑定到 root
或 GCanvas 实例工作正常。 (这两种选择对我都没有用,但我只是尝试了它们以查看发生了什么。)。 运行 OS X,埃尔卡皮坦。
import Tkinter as tk
class GCanvas(tk.Canvas, object):
def __init__(self, master, **kwargs):
tk.Canvas.__init__(self, master, kwargs)
@staticmethod
def enter(e):
print "enter", e.widget, e.x, e.y
@staticmethod
def leave(e):
print "leave", e.widget
@staticmethod
def motion(e):
print "motion", e.widget, e.x, e.y
approach = "bindinstance"
root = tk.Tk()
gc = GCanvas(root, width=400, height=300)
print "root is", root, "gc is", gc
gc.pack()
if approach == "bindGCanvas":
print "binding to GCanvas"
root.bind_class(GCanvas, '<Enter>', GCanvas.enter)
root.bind_class(GCanvas, '<Leave>', GCanvas.leave)
#root.bind_class(GCanvas, '<Motion>', GCanvas.motion)
elif approach == "bindCanvas":
print "binding to Canvas"
root.bind_class(tk.Canvas, '<Enter>', GCanvas.enter)
root.bind_class(tk.Canvas, '<Leave>', GCanvas.leave)
#root.bind_class(tk.Canvas, '<Motion>', GCanvas.motion)
elif approach == "bindinstance":
print "binding to instance"
gc.bind('<Enter>', GCanvas.enter)
gc.bind('<Leave>', GCanvas.leave)
#gc.bind('<Motion>', GCanvas.motion)
else:
print "binding to root"
root.bind('<Enter>', GCanvas.enter)
root.bind('<Leave>', GCanvas.leave)
#root.bind('<Motion>', GCanvas.motion)
root.mainloop()
bind_class
中的"class"是指tk库使用的内部class名称,不是pythonclass名称。更准确地说,在这种情况下,它指的是 bind tag,它恰好与 tk class 同名,它也恰好与以下之一同名核心 Tkinter classes(例如:Toplevel
、Canvas
等)。
要在 class 级别绑定到 GCanvas
,最简单的方法是将名为 GCanvas
的绑定标记添加到您的 canvas,如下所示示例:
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)
有关绑定标签的更多信息,请参阅这些对其他一些 tkinter 问题的回答:
-
我找到了解决两个 text() 框之间的绑定冲突的快速解决方案。
列出绑定标签以对小部件的路径进行排序。列表中的第一次出现。同时在两个小部件上触发了绑定。
<pre><code>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"))
我定义了GCanvas,Canvas的扩展。我的意图是在 class 级别绑定到 GCanvas。它不起作用。
我也试过绑定到tk.Canvas,但也没用。绑定到 root
或 GCanvas 实例工作正常。 (这两种选择对我都没有用,但我只是尝试了它们以查看发生了什么。)。 运行 OS X,埃尔卡皮坦。
import Tkinter as tk
class GCanvas(tk.Canvas, object):
def __init__(self, master, **kwargs):
tk.Canvas.__init__(self, master, kwargs)
@staticmethod
def enter(e):
print "enter", e.widget, e.x, e.y
@staticmethod
def leave(e):
print "leave", e.widget
@staticmethod
def motion(e):
print "motion", e.widget, e.x, e.y
approach = "bindinstance"
root = tk.Tk()
gc = GCanvas(root, width=400, height=300)
print "root is", root, "gc is", gc
gc.pack()
if approach == "bindGCanvas":
print "binding to GCanvas"
root.bind_class(GCanvas, '<Enter>', GCanvas.enter)
root.bind_class(GCanvas, '<Leave>', GCanvas.leave)
#root.bind_class(GCanvas, '<Motion>', GCanvas.motion)
elif approach == "bindCanvas":
print "binding to Canvas"
root.bind_class(tk.Canvas, '<Enter>', GCanvas.enter)
root.bind_class(tk.Canvas, '<Leave>', GCanvas.leave)
#root.bind_class(tk.Canvas, '<Motion>', GCanvas.motion)
elif approach == "bindinstance":
print "binding to instance"
gc.bind('<Enter>', GCanvas.enter)
gc.bind('<Leave>', GCanvas.leave)
#gc.bind('<Motion>', GCanvas.motion)
else:
print "binding to root"
root.bind('<Enter>', GCanvas.enter)
root.bind('<Leave>', GCanvas.leave)
#root.bind('<Motion>', GCanvas.motion)
root.mainloop()
bind_class
中的"class"是指tk库使用的内部class名称,不是pythonclass名称。更准确地说,在这种情况下,它指的是 bind tag,它恰好与 tk class 同名,它也恰好与以下之一同名核心 Tkinter classes(例如:Toplevel
、Canvas
等)。
要在 class 级别绑定到 GCanvas
,最简单的方法是将名为 GCanvas
的绑定标记添加到您的 canvas,如下所示示例:
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)
有关绑定标签的更多信息,请参阅这些对其他一些 tkinter 问题的回答:
我找到了解决两个 text() 框之间的绑定冲突的快速解决方案。 列出绑定标签以对小部件的路径进行排序。列表中的第一次出现。同时在两个小部件上触发了绑定。
<pre><code>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"))