Python 3.x 裁剪图像的多个部分并放置在Tkinter的画布上

Python 3.x 裁剪图像的多个部分并放置在Tkinter的画布上,python-3.x,matlab,canvas,tkinter,tkinter-canvas,Python 3.x,Matlab,Canvas,Tkinter,Tkinter Canvas,我是Tkinter平台的新手,所以请帮助我哪里出了问题。 我有一个楼层平面图图像,我想在其中剪切对象,并将其放置在画布屏幕上,以便可以拖动单个对象(如果我愿意)。 我可以剪切和粘贴屏幕上的对象,但第一个对象除外。它不会被放置在屏幕上。有人能帮我吗 我正在使用Matlab代码识别平面图图像中的对象。我附上Matlab文件。 可以将墙添加到屏幕上吗?我完全不知道。有人能建议怎么加墙吗 这是我的密码 import tkinter as tk from tkinter import * fro

我是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()
将tkinter作为tk导入
从tkinter进口*
从PIL导入图像,ImageTk
从scipy.io导入loadmat
root=tk.tk()
canvas=tk.canvas(宽度=800,高度=800)
grid(行=4,列=0,粘性=(N,W,E,S))
#canvas.config(宽度=100,高度=100)
root.grid\u columnconfigure(0,权重=1)
root.grid_rowconfigure(4,权重=1)
mfile=loadmat('C:\\Users\\User\\Desktop\\tkinter\u code\\obj identification\\ans.mat')
#打印(mfile.values())
#打印(len(mfile['ans'][0]))
打印(mfile.values())
类示例(tk.Frame):
定义初始化(自身,父级):
self.parent=parent
tk.Frame.\uuuu init\uuuuu(自,父)
self.canvas=tk.canvas(宽度=800,高度=800)
self.canvas.grid(行=0,列=0,粘性=(N,W,E,S))
#canvas.pack(expand=1,fill=tk.BOTH)
self.canvas.tag_bind(“DnD”和“”)
self._drag_data={“x”:0,“y”:0,“item”:None}
self.canvas.tag\u bind(“token”,“”,self.drag\u start)
self.canvas.tag\u bind(“token”,“”,self.drag\u stop)
self.canvas.tag_bind(“token”,“”,self.drag)
self.canvas.bind(“,self.on_按钮_1”)
self.iimg=Image.open(“C:\\Users\\User\\Desktop\\tkinter\u code\\floorplan\\ROBIN\\Dataset\u 3rooms\\Cat1\u 1.jpg”)
#iimg=iimg.resize((1000800),Image.ANTIALIAS)
self.canvas.img=ImageTk.PhotoImage(self.iimg)
#canvas.img=canvas.img.resize((250250),Image.antialas)
self.canvas\u img=canvas.create\u image(0,0,image=self.canvas.img,anchor=“nw”)
self.mylist=[]
对于范围内的x(len(mfile['ans'][0]):
#画布。创建矩形((mfile['ans'][0][x][0][0],mfile['ans'][0][x][0][1],mfile['ans'][0][x][0][0]+mfile['ans'][0][x][0][0][1]+mfile['ans'][0][x][0][3]),轮廓为红色,标记=(“标记”,“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][2]、mfile ans 0][x][0][1]+mfile ans 0][x][0][0][3]))
self.canvas.im\u crop2=ImageTk.PhotoImage(self.im\u裁剪)
self.canvas.create_image(mfile['ans'][0][x][0][0],mfile['ans'][0][x][0][1],image=self.canvas.im_crop2)
#canvas.create_image(10001000,image=im_crop2)
#如果(x>=0):
self.mylist.append(self.canvas.im_crop2)
#im_crop.show()
#canvas.iimg=ImageTk.PhotoImage(图像裁剪)
#canvas.create_image(150150,image=canvas.im_crop2)
self.popup=tk.Menu(root,tearoff=0)
#self.popup.add_命令(label=“delete”,command=lambda:self.dele(id))
self.popup.add_命令(label=“delete”,
command=lambda:self.dele(id))
self.popup.add_命令(label=“add”,command=lambda:root.bind(“,self.addn))
root.bind(“,self.do\u弹出窗口)
self.canvas.delete(self.canvas\u img)
def do_弹出窗口(自身、事件):
#显示弹出菜单
尝试:
self.popup.tk_popup(event.x_root,event.y_root,0)
最后:
#确保松开抓斗(仅限Tk 8.0a1)
self.popup.grab_release()
def on_按钮_1(自身,事件):
iid=self.canvas.find_封闭(event.x-150,event.y-150,event.x+150,event.y+100)
#iid=canvas.find_最近(event.x,event.y)[0]
self.canvas.itemconfigure(“DEL”)
self.canvas.dtag(“全部”、“删除”)
self.canvas.itemconfigure(iid,标记=(“DEL”、“DnD”、“token”、“drag”))
#canvas.unbind(“”)
def create_标记(自身、x、y、颜色):
“”“在给定坐标处以给定颜色创建标记”“”
self.canvas.create_矩形(
x,,
Y
x+50,
y+50,
轮廓=颜色,
填充=颜色,
标记=(“标记”、“DnD”),
)
def创建_标记1(自身、x、y、颜色):
self.canvas.create_矩形(
x,,
Y
x+25,
y+25,
轮廓=颜色,
填充=颜色,
标记=(“标记”、“DnD”),
)
def拖放启动(自身、事件):
“”“开始拖动对象”“”
#记录项目及其位置
self._drag_data[“item”]=self.canvas.find_closest(event.x,event.y)[0]
rect=self.canvas.bbox(self.\u拖动\u数据[“项”])
self.canvas.addtag_封闭(“拖动”、*rect)
打印(矩形)
self._drag_data[“x”]=event.x
self._drag_data[“y”]=event.y
def拖放停止(自身,事件):
“”“结束对象的拖动”“”
#重置拖动信息
self._drag_data[“item”]=无
自拖动数据[“x”]=0
自身数据[“y”]=0
self.canvas.dtag(“拖动”、“拖动”)
def拖动(自身、事件):
“”“处理对象的拖动”“”
#计算鼠标移动了多少
self.delta_x=event.x-self._拖动_数据[“x”]
self.delta_y=event.y-self.\u拖动数据[“y”]
#将对象移动适当的量
self.canvas.move(“拖动”,self.delta_x,self.delta_y)
#记录新位置
self._drag_data[“x”]=event.x
self._drag_data[“y”]=event.y
def dele(自我,id):
#canvas.tag_bind(id,“”)
self.canvas.delete(“DEL”)
def地址(自身、事件):
canvas.create_矩形(event.x,event.y,event.x+25,event.y+25,fill='red',tags=(“DnD”,“token”))
root.unb