Обрезка нескольких частей изображения и размещение на холсте в Tkinter - PullRequest
1 голос
/ 05 мая 2020

Я новичок в платформе Tkinter, поэтому, пожалуйста, помогите мне, где я ошибаюсь. У меня есть изображение плана этажа, на котором я хочу вырезать на нем объекты и поместить его на экран холста, чтобы отдельные объекты можно было перетаскивать, если я хочу. Я могу вырезать и вставлять объекты на экране, кроме первого объекта. Он не помещается на экран. Может ли кто-нибудь мне помочь?

Я использую код Matlab для идентификации объектов на изображении плана этажа. Прикрепляю файл Matlab. Можно ли добавить стену к экрану? Я вообще понятия не имею. Может ли кто-нибудь подсказать, как добавить стену?

Вот мой код

import tkinter as tk     
from tkinter import *
from PIL import Image,ImageTk
from scipy.io import loadmat
root = tk.Tk()


canvas = tk.Canvas(width=800, height=800)
canvas.grid(row=4,column=0,sticky=(N,W,E,S))
#canvas.config(width=100,height=100)
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(4, weight=1)
mfile=loadmat('C:\\Users\\User\\Desktop\\tkinter_codes\\obj identification\\ans.mat')
#print(mfile.values())

#print(len(mfile['ans'][0]))
print(mfile.values())


class Example(tk.Frame):


    def __init__(self, parent):
        self.parent =parent
        tk.Frame.__init__(self, parent)
        self.canvas = tk.Canvas(width=800, height=800)
        self.canvas.grid(row=0,column=0,sticky=(N,W,E,S))
        #canvas.pack (expand =1, fill =tk.BOTH)
        self.canvas.tag_bind("DnD","<Button-1>")

        self._drag_data = {"x": 0, "y": 0, "item": None}


        self.canvas.tag_bind("token", "<ButtonPress-1>", self.drag_start)
        self.canvas.tag_bind("token", "<ButtonRelease-1>", self.drag_stop)
        self.canvas.tag_bind("token", "<B1-Motion>", self.drag)
        self.canvas.bind("<ButtonPress-1>", self.on_button_1)
        self.iimg=Image.open("C:\\Users\\User\\Desktop\\tkinter_codes\\floorplans\\ROBIN\\Dataset_3rooms\\Cat1_1.jpg")
        #iimg=iimg.resize((1000, 800), Image.ANTIALIAS)
        self.canvas.img=ImageTk.PhotoImage(self.iimg)
        #canvas.img = canvas.img.resize((250, 250), Image.ANTIALIAS)
        self.canvas_img=canvas.create_image(0,0,image=self.canvas.img,anchor="nw")
        self.mylist=[]

        for x in range(len(mfile['ans'][0])):
            #canvas.create_rectangle((mfile['ans'][0][x][0][0],mfile['ans'][0][x][0][1],mfile['ans'][0][x][0][0]+mfile['ans'][0][x][0][2],mfile['ans'][0][x][0][1]+mfile['ans'][0][x][0][3]),outline='red',tags=("token","DnD"))
            self.im_crop = self.iimg.crop((mfile['ans'][0][x][0][0],mfile['ans'][0][x][0][1],mfile['ans'][0][x][0][0]+mfile['ans'][0][x][0][2],mfile['ans'][0][x][0][1]+mfile['ans'][0][x][0][3]))
            self.canvas.im_crop2=ImageTk.PhotoImage(self.im_crop)
            self.canvas.create_image(mfile['ans'][0][x][0][0],mfile['ans'][0][x][0][1], image=self.canvas.im_crop2)
            #canvas.create_image(1000,1000,image=im_crop2)
            #if(x>=0):
            self.mylist.append(self.canvas.im_crop2)


            #im_crop.show()
            #canvas.iiiimg=ImageTk.PhotoImage(im_crop)
            #canvas.create_image(150,150,image=canvas.im_crop2)



        self.popup = tk.Menu(root, tearoff=0)
    #self.popup.add_command(label="delete",command=lambda: self.dele(id))
        self.popup.add_command(label="delete", 
                               command=lambda: self.dele(id))
        self.popup.add_command(label="add",command= lambda: root.bind("<Button-1>",self.addn))

        root.bind("<Button-3>", self.do_popup)
        self.canvas.delete(self.canvas_img)


    def do_popup(self,event):
      # display the popup menu
        try:
            self.popup.tk_popup(event.x_root, event.y_root, 0)
        finally:
          # make sure to release the grab (Tk 8.0a1 only)
            self.popup.grab_release() 

    def on_button_1(self, event):

        iid = self.canvas.find_enclosed(event.x-150, event.y-150, event.x + 150, event.y + 100)
        #iid=canvas.find_closest(event.x, event.y)[0]
        self.canvas.itemconfigure("DEL")
        self.canvas.dtag("all","DEL")
        self.canvas.itemconfigure(iid, tags=("DEL","DnD","token","drag")) 
        #canvas.unbind("<Button-1>")

    def create_token(self, x, y, color):
        """Create a token at the given coordinate in the given color"""
        self.canvas.create_rectangle(
            x ,
            y ,
            x + 50,
            y + 50,
            outline=color,
            fill=color,
            tags=("token","DnD"),
        )

    def create_token1(self,x,y,color):

        self.canvas.create_rectangle(
            x ,
            y ,
            x + 25,
            y + 25,
            outline=color,
            fill=color,
            tags=("token","DnD"),
        )

    def drag_start(self, event):
        """Begining drag of an object"""
        # record the item and its location
        self._drag_data["item"] = self.canvas.find_closest(event.x, event.y)[0]
        rect=self.canvas.bbox(self._drag_data["item"])
        self.canvas.addtag_enclosed("drag",*rect)
        print(rect)
        self._drag_data["x"] = event.x
        self._drag_data["y"] = event.y

    def drag_stop(self, event):
        """End drag of an object"""
        # reset the drag information
        self._drag_data["item"] = None
        self._drag_data["x"] = 0
        self._drag_data["y"] = 0
        self.canvas.dtag("drag","drag")

    def drag(self, event):
        """Handle dragging of an object"""
        # compute how much the mouse has moved
        self.delta_x = event.x - self._drag_data["x"]
        self.delta_y = event.y - self._drag_data["y"]
        # move the object the appropriate amount
        self.canvas.move("drag", self.delta_x, self.delta_y)
        # record the new position
        self._drag_data["x"] = event.x
        self._drag_data["y"] = event.y

    def dele(self,id):
    #canvas.tag_bind(id,"<Button-1>")
        self.canvas.delete("DEL")


    def addn(self,event):
        canvas.create_rectangle(event.x,event.y,event.x+25,event.y+25,fill='red',tags=("DnD","token"))
        root.unbind("<Button-1>")



Example(root) #pack(fill="both", expand=True)

root.mainloop()

Это код Matlab, который я использую для идентификации объектов

...