Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python特金特;画布对象和事件_Python_Events_Tkinter - Fatal编程技术网

python特金特;画布对象和事件

python特金特;画布对象和事件,python,events,tkinter,Python,Events,Tkinter,我有一个类,其中包含我制作的一些鼠标事件: 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 这个类的实例并不是屏幕上真正的图形对象,但是它们有自己的图形表示

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

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
)。这不是实现此类绑定的方式。在绑定中,您应该做的第一件事是获取当前鼠标坐标,然后计算
d

另一种选择是使用画布的
tag\u bind
方法将绑定放置在每个画布对象上。有关示例,请参见此问题:

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

我无法调试您的代码,因为您只显示了一些细节,但这里有一个工作示例,试图说明
tag\u bind
的用法。我对你的代码做了一些修改。例如,我添加了一个name参数,以便打印出您单击的圆圈。当我测试这一点时,每次点击似乎都在正确的圆圈上注册

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()
将Tkinter作为tk导入
类示例(tk.Frame):
定义初始化(自身,父级):
tk.Frame.\uuuu init\uuuuu(自,父)
self.canvas=tk.canvas(self,宽度=400,高度=400,
背景=“bisque”)
self.canvas.pack(fill=“both”,expand=True)
graphic1=GraphicObject(10,10100100,name=“graphic1”)
graphic2=GraphicObject(110200200,name=“graphic2”)
graphic1.draw(self.canvas)
graphic2.draw(self.canvas)
类GraphicObject(对象):
定义初始化(self,x0,y0,x1,y1,name=None):
self.coords=(x0,y0,x1,y1)
self.name=名称
def绘制(自身、画布、轮廓=“黑色”、填充=“白色”):
item=canvas.create_oval(self.coords,outline=outline,fill=fill)
canvas.tag\u bind(项目“”,self.mouse\u单击)
def鼠标单击(自身,事件):
打印“我点击鼠标(%s)”%self.name
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
示例(root).pack(fill=“both”,expand=True)
root.mainloop()

您使用的GUI工具包可能重复?如何处理鼠标事件?在你的课堂上什么是鼠标点击?请显示更多的代码。我们可以看看您的
\uuuu init\uuuuu
方法吗
class1
您还需要为我们提供对象的init方法:)它太大了;基本上,它包含实例变量(如前面提到的
圆、半径
),并创建圆;绑定也在init methiod.Nope中,它不是全局变量,而是事件函数的局部变量。我现在已经发布了计算(请参见
鼠标点击
),我认为计算没有造成问题。这个
标记绑定
只是半响应,但两个对象都响应。“半响应”是指只注册了一半或更少的鼠标点击。@roberto:没有看到您的代码,我无法解释原因,但我从未在画布上看到过这种情况。根据我的经验,对象上的绑定是100%可靠的。@roberto:我看不出IDE会如何影响您的python代码。我已经更新了我的答案,以显示一些试图模仿您描述的代码。也许你可以从中学习它是如何工作的。解决了它:-)我的代码在椭圆形内画了另一条线,因此这些线已经部分地覆盖了我的对象。我曾经认为它们是我的目标的一部分:/刚刚解决了这个问题,它完全起作用了。感谢您的建议
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()