gpt4 book ai didi

Python; tkinter; Canvas 对象和事件

转载 作者:行者123 更新时间:2023-12-01 05:20:16 25 4
gpt4 key购买 nike

我有一个类,其中包含我制作的一些鼠标事件:

class graphic_object(object):

def mouse_click(self,event):
#do something

def mouse_move(self,event):
#do something

def mouse_unpressed(self,event):
#do something

此类的实例实际上并不是屏幕上的图形对象,但它们具有圆形的图形表示形式,并且正如我所说,它们监听鼠标事件。图形表示和事件处理均由 tkinter.Canvas 对象管理,该对象是它们的可视容器。
当我对这个类进行一个观察时:

graphic1 = graphic_object(a,b,c,d)   # init method takes coordinates of the circle as arguments; a,b,c,d - numbers

一切都按预期进行,对象以所需的方式响应鼠标事件。但是当我做两个实例时:

graphic1 = graphic_object(a,b,c,d)
graphic2 = graphic_object(e,f,g,h)

只有最后创建的对象才会响应鼠标事件。

这是我检查鼠标是否位于圆圈上方的条件:

if d < self.radius:

其中d是鼠标位置与圆心之间的距离,radius是圆的半径。在调试器中,我看到 self.center 始终是最后创建的对象的中心,因此条件始终处于打开状态第二个圆圈。那么,如何才能使两个对象都响应鼠标事件呢?

事件处理:

C = Canvas()
C.bind("<Button-1>" ,self.mouse_click)
C.bind("<B1-Motion>",self.mouse_move)
C.bind("<ButtonRelease-1>",self.mouse_unpressed)

最佳答案

看来您的鼠标绑定(bind)依赖于预先计算的全局变量 (d)。这不是您应该实现此类绑定(bind)的方式。在绑定(bind)中您应该做的第一件事是获取当前鼠标坐标,然后计算d

您的另一个选择是使用 Canvas 的 tag_bind 方法将绑定(bind)放在每个 Canvas 对象上。请参阅此问题的示例:How do I attach event bindings to items on a canvas using Tkinter?

您在对此答案的评论中写道,您有时只会点击鼠标。您的代码中没有足够的细节来了解您在做什么,但我可以向您保证 Canvas 通常不会以这种方式失败。

我无法调试您的代码,因为您只显示了一些片段,但这里有一个工作示例,试图说明 tag_bind 的用法。我对你的代码做了一些改动。例如,我添加了一个名称参数,以便我可以打印出您单击的圆圈。当我测试这个时,每次点击似乎都记录在正确的圆圈上。

import Tkinter as tk

class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.canvas = tk.Canvas(self, width=400, height=400,
background="bisque")
self.canvas.pack(fill="both", expand=True)

graphic1 = GraphicObject(10,10,100,100, name="graphic1")
graphic2 = GraphicObject(110,110,200,200, name="graphic2")

graphic1.draw(self.canvas)
graphic2.draw(self.canvas)

class GraphicObject(object):
def __init__(self, x0,y0,x1,y1, name=None):
self.coords = (x0,y0,x1,y1)
self.name = name

def draw(self, canvas, outline="black", fill="white"):
item = canvas.create_oval(self.coords, outline=outline, fill=fill)
canvas.tag_bind(item, "<1>", self.mouse_click)

def mouse_click(self, event):
print "I got a mouse click (%s)" % self.name

if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()

关于Python; tkinter; Canvas 对象和事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22531013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com