Python:希望使用Tkinter设计一个软件,旨在用鼠标隔离图片的一部分

Python:希望使用Tkinter设计一个软件,旨在用鼠标隔离图片的一部分,python,image,opencv,tkinter,Python,Image,Opencv,Tkinter,所以我尝试用python和Tkinter设计一个软件。 我想做的是一个界面(我不在乎外观),它将图片的一部分隔离为鼠标的clic。 特点:鼠标后的正方形,50px²,要切割的部分 有效部分切割 窗口必须显示图片 我已经做到了以下几点: # -*- coding: utf-8 -*- """ Created on Fri Jan 23 22:25:33 2015 @author: Dogeek """ import Tkinter as tk import cv2 class Frame(t

所以我尝试用python和Tkinter设计一个软件。 我想做的是一个界面(我不在乎外观),它将图片的一部分隔离为鼠标的clic。 特点:鼠标后的正方形,50px²,要切割的部分 有效部分切割 窗口必须显示图片

我已经做到了以下几点:

# -*- coding: utf-8 -*-
"""
Created on Fri Jan 23 22:25:33 2015

@author: Dogeek
"""

import Tkinter as tk
import cv2

class Frame(tk.Frame):
    """Main window. Class containing every widget used, and inheriting from     tk.Frame"""
    r = 25
    def __init__(self,window, **kwargs):
        tk.Frame.__init__(self,window,width=1024,height=768,**kwargs)
        self.pack(fill=tk.BOTH)
        #Widgets and vars
        self.imageLoad = "tennis.gif"
        self.image=tk.PhotoImage(file=self.imageLoad)
        tk.Button(self, text ="quit", command=self.Quit).pack(side="bottom")
        self.Canvas=tk.Canvas(self,width=self.image.width(),height=self.image.height(), bg ='white')
        self.Canvas.create_image(self.image.width()/2,self.image.height()/2,anchor=tk.CENTER,image=self.image)
        self.Canvas.bind('<Motion>',self.hover) #<Motion> or <Enter> ???
        self.Canvas.bind('<Button-1>',self.isolate)
        #self.Canvas.focus_set()
        self.Canvas.pack(side='top')

     def hover(self,event):
        """Function designed to make a cursor sized for the rectangle to     isolate"""
        X = event.x
        Y = event.y
        rect=self.Canvas.create_rectangle(X-self.r, Y-self.r, X+self.r,Y+self.r, outline='black')
        #self.Canvas.delete(rect)
        pass

    def isolate(self,event):
        """Function designed to cut a square out of the main picture and store it. The file lines are here to increment the filename so 
    that it doesn't overwrite the previous ones"""
        x=int(event.x)
        y=int(event.y)
        imagecv=cv2.imread(self.imageLoad)
#for some reason, for it to work, I have to         #put the name hardcoded, cant use my var.       #Is it beacause opencv doesnt handle .gif                 #well?
        """f=open("fichier.txt","r")
        line=f.read()
        count=int(line)
        f.close()
        count+=1
        f=open("fichier.txt","w")
        f.write("{}".format(self.count))
        f.close()"""
        RegionOfInterest=imagecv[y-self.r:y+self.r,x-self.r:x+self.r]
        cv2.imwrite("tennis_cut.png", RegionOfInterest)
        pass
    def Quit(self):
        self.quit()
        self.destroy()

window=tk.Tk()
frame=Frame(window)
frame.mainloop()
#-*-编码:utf-8-*-
"""
创建于2015年1月23日星期五22:25:33
@作者:Dogeek
"""
将Tkinter作为tk导入
进口cv2
类框架(tk.Frame):
“”“包含所使用的每个小部件并从tk.Frame继承的主窗口.Class”“”
r=25
定义初始值(自身、窗口、**kwargs):
tk.Frame.\uuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuu(自,窗,宽=1024,高=768,**kwargs)
自包装(填充=tk.两个)
#小部件和变量
self.imageLoad=“netsiness.gif”
self.image=tk.PhotoImage(文件=self.imageLoad)
按钮(self,text=“quit”,command=self.quit).pack(side=“bottom”)
self.Canvas=tk.Canvas(self,width=self.image.width(),height=self.image.height(),bg='white')
self.Canvas.create_image(self.image.width()/2,self.image.height()/2,anchor=tk.CENTER,image=self.image)
self.Canvas.bind(“”,self.hover)#还是???
self.Canvas.bind(“”,self.isolate)
#self.Canvas.focus_set()
self.Canvas.pack(side='top')
def悬停(自身、事件):
“”“设计用于使光标大小适合要隔离的矩形的函数”“”
X=事件.X
Y=事件。Y
rect=self.Canvas.create_矩形(X-self.r,Y-self.r,X+self.r,Y+self.r,outline='black')
#self.Canvas.delete(rect)
通过
def隔离(自身、事件):
“”“函数,用于从主图片中剪切出一个正方形并存储它。此处的文件行用于增加文件名,以便
它不会覆盖以前的内容“”
x=int(event.x)
y=int(event.y)
imagecv=cv2.imread(self.imageLoad)
#出于某种原因,为了让它工作,我必须把名字硬编码,不能使用我的变量。是因为opencv不能处理.gif吗?
“f=open(“fichier.txt”、“r”)
行=f.read()
计数=整数(行)
f、 关闭()
计数+=1
f=打开(“fichier.txt”,“w”)
f、 写入(“{}.format(self.count))
f、 关闭()
RegionFinTerest=imagecv[y-self.r:y+self.r,x-self.r:x+self.r]
cv2.imwrite(“netsiness_cut.png”,RegionFinterest)
通过
def退出(自我):
self.quit()
自我毁灭
window=tk.tk()
框架=框架(窗口)
frame.mainloop()

所以它没有像我期望的那样工作。我提前道歉,英语不是我的母语,法语是。我真的需要一些帮助,我被困在这里,任何定义的函数都不起作用,我真的很绝望。谢谢


编辑:我设法使隔离功能工作。悬停功能不显示我的方块,我需要知道我剪下了哪张图片。我试图在创建正方形后不删除它,或者用“after”方法延迟,但没有成功。

因此我设法解决了这个问题。我不知道有一个Canvas.coords()方法允许我移动方块: 最终代码:

# -*- coding: utf-8 -*-
"""
Created on Fri Jan 23 22:25:33 2015

@author: Dogeek
"""

import Tkinter as tk
import cv2

class Frame(tk.Frame):
    """Main window. Class containing every widget used, and inheriting from tk.Frame"""
    def __init__(self,window, **kwargs):
        tk.Frame.__init__(self,window,width=1024,height=768,**kwargs)
        self.pack(fill=tk.BOTH)
        self.r=tk.IntVar()
        self.r.set(50)
        #Creation des widgets
        self.imageLoad = "tennis.gif"
        self.image=tk.PhotoImage(file=self.imageLoad)
        tk.Button(self, text ="quit", command=self.Quit).grid(row=0,column=0)
        self.Canvas = tk.Canvas(self, width =self.image.width(),height=self.image.height(), bg ='white')
        self.Canvas.create_image(self.image.width()/2,self.image.height()/2,anchor=tk.CENTER,image=self.image)
        self.rect=self.Canvas.create_rectangle(25-self.r.get(), 25-self.r.get(), 25+self.r.get(), 25+self.r.get(), outline='black')
        self.Canvas.bind('<Motion>',self.hover) #<Motion> or <Enter> ??
        self.Canvas.bind('<Button-1>',self.isolate)
        #self.Canvas.focus_set()
        self.Canvas.grid(row=1,column=0)
        self.spin=tk.Spinbox(self, from_=1,to=500, increment=2, width=10)
        self.spin.config(textvariable=self.r, font="sans 24", justify="center")
        self.spin.grid(row=0,column=1)

    def hover(self,event):
        """Function designed to make a cursor sized for the rectangle to isolate"""
        X = event.x
        Y = event.y
        self.Canvas.coords(self.rect,X-self.r.get()/2, Y-self.r.get()/2, X+self.r.get()/2, Y+self.r.get()/2)
        pass

    def isolate(self,event):
        """Function designed to cut a square out of the main picture and     store it. The file lines are here to increment the filename so 
        that it doesn't overwrite the previous ones"""
        x=int(event.x)
        y=int(event.y)
        imagecv=cv2.imread("tennis.jpg")
        """f=open("fichier.txt","r")
        line=f.read()
        count=int(line)
        f.close()
        count+=1
        f=open("fichier.txt","w")
        f.write("{}".format(self.count))
        f.close()"""
        RegionOfInterest=imagecv[y-self.r.get()/2:y+self.r.get()/2,x-self.r.get()/2:x+self.r.get()/2]
        cv2.imwrite("tennis_cut.png", RegionOfInterest)
        pass
    def Quit(self):
        self.quit()
        self.destroy()

window=tk.Tk()
frame=Frame(window)
frame.mainloop()
#-*-编码:utf-8-*-
"""
创建于2015年1月23日星期五22:25:33
@作者:Dogeek
"""
将Tkinter作为tk导入
进口cv2
类框架(tk.Frame):
“”“包含所使用的每个小部件并从tk.Frame继承的主窗口.Class”“”
定义初始值(自身、窗口、**kwargs):
tk.Frame.\uuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuu(自,窗,宽=1024,高=768,**kwargs)
自包装(填充=tk.两个)
self.r=tk.IntVar()
自恢复装置(50)
#创建des小部件
self.imageLoad=“netsiness.gif”
self.image=tk.PhotoImage(文件=self.imageLoad)
按钮(self,text=“quit”,command=self.quit).grid(行=0,列=0)
self.Canvas=tk.Canvas(self,width=self.image.width(),height=self.image.height(),bg='white')
self.Canvas.create_image(self.image.width()/2,self.image.height()/2,anchor=tk.CENTER,image=self.image)
self.rect=self.Canvas.create_矩形(25 self.r.get(),25 self.r.get(),25+self.r.get(),25+self.r.get(),outline='black')
self.Canvas.bind(“”,self.hover)#或??
self.Canvas.bind(“”,self.isolate)
#self.Canvas.focus_set()
self.Canvas.grid(行=1,列=0)
self.spin=tk.Spinbox(self,from=1,to=500,increment=2,width=10)
self.spin.config(textvariable=self.r,font=“sans 24”,justify=“center”)
self.spin.grid(行=0,列=1)
def悬停(自身、事件):
“”“设计用于使光标大小适合要隔离的矩形的函数”“”
X=事件.X
Y=事件。Y
self.Canvas.coords(self.rect,X-self.r.get()/2,Y-self.r.get()/2,X+self.r.get()/2,Y+self.r.get()/2)
通过
def隔离(自身、事件):
“”“函数,用于从主图片中剪切出一个正方形并存储它。此处的文件行用于增加文件名,以便
它不会覆盖以前的内容“”
x=int(event.x)
y=int(event.y)
imagecv=cv2.imread(“networks.jpg”)
“f=open(“fichier.txt”、“r”)
行=f.read()
计数=整数(行)
f、 关闭()
计数+=1
f=打开(“fichier.txt”,“w”)
f、 写入(“{}.format(self.count))
f、 关闭()
RegionFinTerest=imagecv[y-self.r.get()/2:y+self.r.get()/2,x-self.r.get()/2:x+self.r.get()/2]
cv2.imwrite(“netsiness_cut.png”,RegionFinterest)
通过
def退出(自我):
self.quit()
自我毁灭
window=tk.tk()
框架=框架(窗口)
frame.mainloop()

“所以它没有像我期望的那样工作”-你是什么意思?有任何错误或不需要的输出吗?