Python:希望使用Tkinter设计一个软件,旨在用鼠标隔离图片的一部分
所以我尝试用python和Tkinter设计一个软件。 我想做的是一个界面(我不在乎外观),它将图片的一部分隔离为鼠标的clic。 特点:鼠标后的正方形,50px²,要切割的部分 有效部分切割 窗口必须显示图片 我已经做到了以下几点: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
# -*- 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()
“所以它没有像我期望的那样工作”-你是什么意思?有任何错误或不需要的输出吗?