以前在Windows上做界面用MFC,现在做算法都是基于Python,所以转用Python的Tkinter库来做。主要是能使用Opencv和Torch处理数据,然后在界面上显示。
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.messagebox
import tkinter.filedialog
import cv2 as cv
from PIL import Image, ImageTk
import time
import threading
RELIEF=['flat', 'raised', 'sunken', 'solid', 'ridge', 'groove']
CURSOR=['arrow','circle','clock','cross','dotbox','exchange',
'fleur','heart','man','mouse','pirate','plus',
'shuttle','sizing','spider','spraycan','star','target',
'tcross','trek','watch']
def PIL2CV(im):
im = im[:, :, ::-1]
return ImageTk.PhotoImage(Image.fromarray(im))
def Buttom1_CallBack():
filename = tk.filedialog.askopenfilename() #弹出文件选择对话框
if filename=='': #用户没有选择任何文件
return
new_img = cv.imread(filename)
if new_img is None:
tk.messagebox.showerror('抱歉', '图片加载失败!')
return
new_img = cv.resize(new_img, (130, 120))
new_img = PIL2CV(new_img)
#后面两句实现图片切换显示
Label2.configure(image=new_img, width=130, height=120)
Label2.image = new_img
tk.messagebox.showinfo('提示','加载图片完成!')
def Buttom2_CallBack():
info = Combobox1.get()
param = Entry1.get()
tk.messagebox.showwarning('警告', '你选择了:'+info+' '+param)
def process_code(delay):
for i in range(100):
Progressbar1['value'] = i+1
root.update()
time.sleep(delay)
Buttom3.configure(text='开始处理', state='normal')
tk.messagebox.showinfo('提示', '处理完成!')
Progressbar1.configure(value=0)
def Buttom3_CallBack():
yn = tk.messagebox.askyesno('警告','是否需要开始处理?')
if not yn:
return
Buttom3.configure(text='处理中...', state='disabled') #控件失效
delay = 0.01
# 单独开一个线程,绑定线程函数process_code,参数后面的','很关键
# 不开线程界面会进入处理函数死循环,用户体验不太好
t = threading.Thread(target=process_code, args=(delay,))
t.start()
def Buttom4_CallBack():
global page_count
if page_count=0:
page_count = 0
return
else:
page_count -= 1
Label4.configure(text='第'+str(page_count)+'页')
return
def Buttom5_CallBack():
global page_count
if page_count>=100:
page_count = 100
return
else:
page_count += 1
Label4.configure(text='第' + str(page_count) + '页')
return
#上面是控件的响应函数
################################################################################
#下面是界面控件的布局
#主界面
root = tk.Tk()
root.title('python界面测试') #修改界面标题
root.iconbitmap('img/tm.ico') #修改界面ico
root.geometry('800x500') #设定界面尺寸 HxW
root.resizable(width=False, height=False) #不允许调整窗口大小,不固定删除此行
#添加两个板块边界框
Frame1 = tk.LabelFrame(root, height=200, width=145)
Frame1.place(x=15, y=100)
Frame2 = tk.LabelFrame(root, text="结果显示", height=400, width=620)
Frame2.place(x=170, y=5)
#添加图片显示框、加载图片框、加载图片按钮
img = cv.imread('img/title.jpg') #opencv加载图片
img = cv.resize(img, (140,70)) #图片缩放
img = PIL2CV(img) #opencv格式转pillow
Label1 = tk.Label(root, image=img) #初始化默认图片
Label1.place(x=15, y=20) #图片显示框在界面上的位置
Label2 = tk.Label(root,
width=18,height=7, #控件大小(注意单位不是像素)
bg="white") #默认白色背景
Label2.place(x=20,y=110) #图片显示框在界面上的位置
Buttom1 = tk.Button(root,
width=15,height=1, #按钮大小
text='加载检索图片', #按钮文本
relief=RELIEF[3], #按钮的风格
command=Buttom1_CallBack) #绑定响应函数
Buttom1.place(x=25, y=250) #按钮在界面上的位置
#添加参数文本框、下拉框、下拉框内容输出按钮
Combobox1 = ttk.Combobox(root, width=17, height=1)
Combobox1['value'] = ('窗前明月光','疑是地上霜','举头望明月','明月照我影')
Combobox1.current(0)
Combobox1.place(x=15, y=320)
Label3 = tk.Label(root, text='参数')
Label3.place(x=15, y=350)
Entry1 = ttk.Entry(root, width=9) #文本框为啥没有H
Entry1.place(x=50, y=350)
Entry1.insert(0,'0.5')
Buttom2 = tk.Button(root,
width=15,height=1,
text='你选择了什么?',
relief=RELIEF[3],
command=Buttom2_CallBack)
Buttom2.place(x=25, y=380)
#添加进度条、开始处理按钮
Progressbar1 = ttk.Progressbar(root, length=600, value=0, cursor=CURSOR[1])
Progressbar1.place(x=15, y=460)
Buttom3 = tk.Button(root,
width=15,height=1,
text='开始处理',
relief=RELIEF[3],
command=Buttom3_CallBack)
Buttom3.place(x=630, y=455)
#添加两个滚动按钮
Buttom4 = tk.Button(root,
width=3,height=1,
text='',
relief=RELIEF[1],
command=Buttom4_CallBack)
Buttom4.place(x=380, y=410)
global page_count #全局变量,用来控制页码
page_count=0
Label4 = tk.Label(root, text='第0页')
Label4.place(x=420, y=410)
Buttom5 = tk.Button(root,
width=3,height=1,
text='>',
relief=RELIEF[1],
command=Buttom5_CallBack)
Buttom5.place(x=470, y=410)
root.mainloop()
#这句话后面不能有代码