python tkinter画布将背景图像放在中间

问题描述 投票:0回答:1

全部

这是我第一次使用Tkinter。

我的工作是加载图像,在对象上绘制边界框,并为它们提供正确的标签,如下所示:

“文字”

这是我的代码

class ExampleApp(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.x = 0
        self.y = 0
        self.img = ImageTk.PhotoImage(file = "0.png") 
        self.canvas = tk.Canvas(self, width=1080, height=720)
        self.canvas.create_image(20, 20, anchor=NW, image=self.img)
        self.canvas.pack()
        self.canvas.bind("<ButtonPress-1>", self.on_button_press)
        self.canvas.bind("<B1-Motion>", self.on_move_press)
        self.canvas.bind("<Motion>", self.moving)

        self.start_x = None
        self.start_y = None
        self.rect = None


    def right_click(self, event):
        self.canvas.delete(self.canvas.find_closest(event.x, event.y))

    def moving(self, event):
        all_item = self.canvas.find_all()

        for i in all_item[1:]:
            for i in all_item:
                self.canvas.itemconfig(i, width=2.0, outline='red')

            target = self.canvas.find_closest(event.x, event.y)[0]
            self.canvas.itemconfig(target, width=4.0, outline='yellow')

    def on_button_press(self, event):
        self.start_x = event.x
        self.start_y = event.y
        self.rect = self.canvas.create_rectangle(self.x, self.y, 1, 1, width=2.0, outline='red')

    def on_move_press(self, event):
        curX, curY = (event.x, event.y)
        self.canvas.coords(self.rect, self.start_x, self.start_y, curX, curY)

    def on_button_release(self, event):
        pass

if __name__ == "__main__":
    app = ExampleApp()
    app.mainloop()

我想要的是当我将鼠标内部移动到矩形时,它会变成黄色。

问题是,只有当鼠标完全位于矩形边缘时,矩形才会变成黄色。

因为背景图片也是画布项目之一,所以find_closest函数将始终是

当鼠标不在矩形边缘时返回图片。

任何人都有更好的主意?

python canvas tkinter label
1个回答
0
投票

对于实心矩形,您只需要

create_rectangle(..., activeoutline="yellow") 

没有usinig函数moving()


对于空矩形,您必须获取所有矩形并使用canvas.bbox(id)获取矩形(x1,y1,x2,y2)使用的区域并与event.x, event.y比较

仅检查矩形,我在矩形中添加了标签

self.canvas.create_rectangle(..., tag='rect')

后来我只能用]获得矩形>

all_rect = self.canvas.find_withtag('rect')

def moving(self, event):
    all_rect = self.canvas.find_withtag('rect')

    x = event.x
    y = event.y

    for i in all_rect:
        x1, y1, x2, y2 = self.canvas.bbox(i)

        if x1 <= x <= x2 and y1 <= y <= y2:
            self.canvas.itemconfig(i, width=4.0, outline='yellow')
        else:
            self.canvas.itemconfig(i, width=2.0, outline='red')

最终代替使用find_withtag()bbox(),您可以使用列表保留

(rect_id, (x1,y1,x2,y3), text_id) 

并在moving()中使用它来查找rect,然后您也可以在rect中更改文本。


完整示例代码。

我添加了重叠的矩形以测试它是否会改变两个矩形的颜色。

import tkinter as tk
from PIL import ImageTk

class ExampleApp(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)

        self.x = 0
        self.y = 0

        self.img = ImageTk.PhotoImage(file="image.jpg") 
        self.canvas = tk.Canvas(self, width=1080, height=720)
        self.canvas.pack()

        self.canvas.bind("<ButtonPress-1>", self.on_button_press)
        self.canvas.bind("<B1-Motion>", self.on_move_press)
        self.canvas.bind("<Motion>", self.moving)

        self.canvas.create_image(20, 20, anchor='nw', image=self.img)

        self.canvas.create_rectangle(50, 50, 100, 100, width=2.0, outline='red', tag='rect')
        self.canvas.create_rectangle(200, 200, 250, 250, width=2.0, outline='red', tag='rect')
        self.canvas.create_rectangle(75, 75, 225, 225, width=2.0, outline='red', tag='rect')

        self.start_x = None
        self.start_y = None
        self.rect = None

    def right_click(self, event):
        self.canvas.delete(self.canvas.find_closest(event.x, event.y))

    def moving(self, event):
        all_rect = self.canvas.find_withtag('rect')

        x = event.x
        y = event.y

        for i in all_rect:
            x1, y1, x2, y2 = self.canvas.bbox(i)
            if x1 <= x <= x2 and y1 <= y <= y2:
                self.canvas.itemconfig(i, width=4.0, outline='yellow')
            else:
                self.canvas.itemconfig(i, width=2.0, outline='red')

    def on_button_press(self, event):
        self.start_x = event.x
        self.start_y = event.y
        self.rect = self.canvas.create_rectangle(self.x, self.y, 1, 1, width=2.0, outline='red')

    def on_move_press(self, event):
        curX, curY = (event.x, event.y)
        self.canvas.coords(self.rect, self.start_x, self.start_y, curX, curY)

    def on_button_release(self, event):
        pass

if __name__ == "__main__":
    app = ExampleApp()
    app.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.