我有2个画布矩形,其中有一个按钮-1的绑定.有时我希望当一个矩形得到这个事件时,另一个矩形也应该得到这个事件.所以我必须通过小部件方法"EVENT_GENERATE"复制-1\f25 Button-1事件.

我的示例代码很少,所以您只能按一次鼠标左键.当您在红色矩形上按下鼠标左键时,可以识别此事件,这可以通过显示消息"Button1 red"来证明.因为我已经 for each 矩形添加了第二个绑定,所以也启动了方法"Create_Event_for_Rectangle",显示的消息"Create Event for Other Rectangle"证明了这一点.此方法还会在绿色矩形处生成新的Button-1事件.生成的事件的坐标似乎是正确的,因为另外还在计算的坐标上创建了一个小矩形.这个在绿色矩形处生成的事件现在应该会创建消息"Button1 green 45 45",但是什么都没有发生.

这是我的代码:

import tkinter as tk
class rectangle():
    def __init__(self, factor, color):
        self.canvas_id=canvas.create_rectangle(factor*10,factor*10,
                       (factor+1)*10,(factor+1)*10,fill=color)
        canvas.tag_bind(self.canvas_id, "<Button-1>", self.button1)
        self.color = color
    def button1(self, event):
        print("button1", self.color, event.x, event.y)
    def get_canvas_id(self):
        return self.canvas_id
    def get_center(self):
        coords = canvas.coords(self.canvas_id)
        return (coords[0]+coords[2])/2, (coords[1]+coords[3])/2
def create_event_for_rectangle(not_clicked):
    print("Create event for other rectangle")
    canvas.tag_unbind(red.get_canvas_id()  , "<Button-1>", func_id_red)
    canvas.tag_unbind(green.get_canvas_id(), "<Button-1>", func_id_green)
    not_clicked_center_x, not_clicked_center_y = not_clicked.get_center()
    canvas.event_generate("<Button-1>",
           x=not_clicked_center_x, y=not_clicked_center_y)
    canvas.create_rectangle(not_clicked_center_x-1, not_clicked_center_y-1,
                            not_clicked_center_x+1, not_clicked_center_y+1)
root   = tk.Tk()
canvas = tk.Canvas(width=100, height=100)
canvas.grid()
red    = rectangle(1, "red"  )
green  = rectangle(4, "green")
func_id_red   = canvas.tag_bind(red.get_canvas_id()  , "<Button-1>",
                lambda event: create_event_for_rectangle(green), add="+multi")
func_id_green = canvas.tag_bind(green.get_canvas_id(), "<Button-1>",
                lambda event: create_event_for_rectangle(red  ), add="+multi")
root.mainloop()

我做错了什么?

推荐答案

这是因为tag_unbind()unbind()清除了所有现有的处理程序.后端TCL/Tk库不提供解绑命令,unbind()中有the current implementation个绑定了一个伪空脚本.(在这个问题上有an old open issue分.用ping命令解决这个问题怎么样?)

更改事件处理程序和合成事件会使程序变得不必要地复杂.在您的例子中,使用after_idle()和闭包要好得多,如下例所示.

import tkinter as tk

root = tk.Tk()

canvas = tk.Canvas(width=100, height=100)
canvas.grid()

class rectangle():
    def __init__(self, factor, color):
        self.canvas_id = canvas.create_rectangle(...)
        canvas.tag_bind(self.canvas_id, "<Button-1>", self.button1)
        self.other = None
    def get_center(self):
        coords = canvas.coords(self.canvas_id)
        return (coords[0]+coords[2])/2, (coords[1]+coords[3])/2
    def button1(self, event=None):
        print("button1", self.color, event)
        other = self.other
        if other and event:
            x, y = other.get_center()
            canvas.create_rectangle(x-1, y-1, x+1, y+1)
            print("Schedule the button1() of other rectangle")
            root.after_idle(other.button1)

red = rectangle(1, "red"  )
green = rectangle(4, "green")
red.other = green
green.other = red

root.mainloop()

Python相关问答推荐

预期LP_c_Short实例而不是_ctyles.PyCStructType

回归回溯-2D数组中的单词搜索

Ibis中是否有一个ANY或ANY_UTE表达,可以让我比较子查询返回的一组值中的值?

如何获取Django REST框架中序列化器内部的外卡属性?

过载功能是否包含Support Int而不是Support Int?

覆盖Django rest响应,仅返回PK

在上下文管理器中更改异常类型

Python中是否有方法从公共域检索搜索结果

从收件箱中的列中删除html格式

如何使用html从excel中提取条件格式规则列表?

运行终端命令时出现问题:pip start anonymous"

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

优化pytorch函数以消除for循环

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

所有列的滚动标准差,忽略NaN

使用NeuralProphet绘制置信区间时出错

转换为浮点,pandas字符串列,混合千和十进制分隔符

重置PD帧中的值

在matplotlib中使用不同大小的标记顶部添加批注

为什么Python内存中的列表大小与文档不匹配?