Использование неразрезанной части изображения на холсте в Tkinter - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в платформе Tkinter. Пожалуйста, помогите мне развеять мои сомнения. У меня есть изображение плана этажа, и я хочу вырезать объекты внутри него и разместить на экране холста. Теперь я хочу разместить часть изображения, которая останется после вырезания всех объектов. Когда я использую функцию кадрирования, она просто копирует эту часть изображения, но не удаляет эту часть изображения из нее. Так может кто-нибудь сказать мне, как я могу использовать неразрезанную часть изображения.

Вот мой код

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=0,column=0,sticky=(N,W,E,S))
#canvas.config(width=100,height=100)
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, 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, bg='white')
        self.canvas.grid(row=0,column=0,sticky=(N,W,E,S))
        #self.canvasScale     = 1.0
        #self.canvasScale *= 2.0
        #canvas.pack (expand =1, fill =tk.BOTH)
        self.canvas.tag_bind("DnD","<Button-1>")

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

        self.mylist=[]   
        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_3roomsmall\\Cat1_1.jpg")
        #iimg=iimg.resize((1000, 800), Image.ANTIALIAS)
        self.canvas.img=ImageTk.PhotoImage(self.iimg)
        #self.mylist.append(self.canvas.img)
        #canvas.img = canvas.img.resize((250, 250), Image.ANTIALIAS)
        self.canvas_img=self.canvas.create_image(0,0,image=self.canvas.img,anchor="nw")
        #self.mylist.append(self.iimg)

        #for x in range(len(mfile['ans'][0])):
         #   self.iddi=self.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],fill='white',outline='white',tags="whi")
          #  self.mylist.append("whi")


            #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"))




#HERE IAM JUST CROPPING ONE IMAGE FOR SIMPLICITY 
        self.im_crop = self.iimg.crop((23,28,23+136,28+66))
        self.canvas.im_crop2=ImageTk.PhotoImage(self.im_crop)
        self.canvas.create_image((23+23+136)//2,(28+28+66)//2, 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.canvas.im_crop3=ImageTk.PhotoImage(self.iimg)
       # self.canvas.create_image(0,0, image=self.canvas.im_crop3,anchor="nw")
       # self.mylist.append(self.iimg)
        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_closest(event.x, event.y)[0]
        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]
        #self._drag_data["item"] = self.canvas.find_enclosed(event.x-150, event.y-150, event.x + 150, event.y + 100)
        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()
...