用Python给图像算法做个简单应用界面

以前在Windows上做界面用MFC,现在做算法都是基于python,所以转用python的Tkinter库来做。主要是能使用Opencv和Torch处理数据,然后在界面上显示。

效果如下:

主要包括3个板块,其余还有一些小功能:

1、显示固定的图片。或从电脑加载一张图片并显示(涉及到按钮的响应函数编写和弹窗)

2、下拉框和文本框的使用

3、进度条的使用(涉及到多线程)

Tkinter支持控件自动调整布局,但是时间比较赶就不研究了,使用固定位置布局,界面也不给调整。

控件名称

  • Buttom 按钮,软件交互功能实现
  • Label (叫什么不重要),用来显示图片或文字
  • ComboBox 下拉框,做选择
  • Entry 文本框,做文本输入
  • Progressbar 进度条,算法跑起来之后显示进度
  • LabelFrame (...),灰色的框框,模块化布局控件

代码如下:

import tkinter as tkimport tkinter.ttk as ttkimport tkinter.messageboximport tkinter.filedialogimport cv2 as cvfrom PIL import Image, ImageTkimport timeimport 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') #修改界面icoroot.geometry('800x500') #设定界面尺寸 HxWroot.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格式转pillowLabel1 = 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) #文本框为啥没有HEntry1.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=0Label4 = 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()#这句话后面不能有代码

以上就是用python给图像算法做个简单应用界面的详细内容,更多关于python 应用界面的资料请关注 其它相关文章!

相关文章

发表新评论